通过Python更改CSV文件中的特定值

iho*_*rko 18 python csv filereader

我需要改变csv文件列的特定值的方法.例如,我有csv文件:

"Ip","Sites"
"127.0.0.1",10
"127.0.0.2",23
"127.0.0.3",50
Run Code Online (Sandbox Code Playgroud)

我需要更改"127.0.0.2"的值23到30.

我使用csv库:import csv

感谢任何帮助,因为我是Python的新手.谢谢!

Die*_*rro 35

这是打开csv文件,更改内存中的值然后将更改写回磁盘的解决方案.

r = csv.reader(open('/tmp/test.csv')) # Here your csv file
lines = list(r)
Run Code Online (Sandbox Code Playgroud)

线条内容:

[['Ip', 'Sites'],
 ['127.0.0.1', '10'],
 ['127.0.0.2', '23'],
 ['127.0.0.3', '50']]
Run Code Online (Sandbox Code Playgroud)

修改值:

lines[2][1] = '30'
Run Code Online (Sandbox Code Playgroud)

线条内容:

[['Ip', 'Sites'],
 ['127.0.0.1', '10'],
 ['127.0.0.2', '30'],
 ['127.0.0.3', '50']]
Run Code Online (Sandbox Code Playgroud)

现在我们只需将其写回文件即可

writer = csv.writer(open('/tmp/output.csv', 'w'))
writer.writerows(lines)
Run Code Online (Sandbox Code Playgroud)

  • 如果您在写入的 csv 上遇到双换行问题,您可能需要尝试将文件作为二进制文件打开: `writer = csv.writer(open('/tmp/output.csv', 'wb'))` (2认同)
  • 你必须关闭作家吗? (2认同)
  • 您应该关闭文件描述符而不是编写器。您可以使用“with”来管理文件 (2认同)

Dar*_*mas 14

您无法真正替换现有文件中的值.相反,你需要:

  1. 读入现有文件
  2. 改变内存中的文件
  3. 写出新文件(覆盖现有文件)

您还可以做的是逐行读取现有文件,将其写入新文件,同时立即替换值.完成后,关闭两个文件,删除原始文件并重命名新文件.


Yur*_*ury 13

您可以使用非常强大的名为pandas的库.这是一个例子.

import pandas as pd
df = pd.read_csv("test.csv")
df.head(3) #prints 3 heading rows
Run Code Online (Sandbox Code Playgroud)

输出:

    Ip  Sites
0   127.0.0.1   10
1   127.0.0.2   23
2   127.0.0.3   50
Run Code Online (Sandbox Code Playgroud)

现在,如果要更改第1行"站点"列中的值,请运行:

df.set_value(1, "Sites", 30)
Run Code Online (Sandbox Code Playgroud)

如果要更改所有值,其中'Ip'等于127.0.0.2,请运行:

df.loc[df["Ip"]=="127.0.0.2", "Sites"] = 30
Run Code Online (Sandbox Code Playgroud)

最后,保存值:

df.to_csv("test.csv", index=False)
Run Code Online (Sandbox Code Playgroud)

  • 这是因为该文件仍处于打开状态。关闭它,你就一切都好了。 (2认同)

Gin*_*pin 5

接受答案的替代方法是:

  • 使用fileinputwithinplace=True就地修改文件
  • 用于csv.DictReader通过标题而不是索引访问列
    • 这仅在 CSV 具有标题时才有效

测试CSV:

Ip,Sites
127.0.0.1,10
127.0.0.2,23
127.0.0.3,50
Run Code Online (Sandbox Code Playgroud)

测试代码:

import fileinput

with fileinput.input(files=('test.csv'), inplace=True, mode='r') as f:
    reader = csv.DictReader(f)
    print(",".join(reader.fieldnames))  # print back the headers
    for row in reader:
        if row["Ip"] == "127.0.0.2":
            row["Sites"] = "30"
        print(",".join([row["Ip"], row["Sites"]]))
Run Code Online (Sandbox Code Playgroud)

主要区别在于您不必像inplace=True在幕后那样手动打开输入文件并创建输出文件:

可选的就地过滤:如果将关键字参数inplace=True传递给构造函数fileinput.input()或传递给FileInput构造函数,则将文件移动到备份文件,并将标准输出定向到输入文件(如果与备份文件同名的文件已存在,它将被默默替换)。这使得编写一个过滤器来重写其输入文件成为可能。

循环逐行遍历 CSV(标题行除外),因此您可以对每一行进行所需的任何处理。

如果您仍想保留原始文件,则可以传入 abackup=".backup"fileinput创建test.csv.backup文件。

另请注意,使用就地编辑时,“标准输出被定向到输入文件”,因此将其print(..)打印到文件而不是命令行。如果要实际打印到控制台,则需要stderrprint(..., file=sys.stderr).