我需要一种方法来更改 CSV 文件的列的特定值。例如,我有这个 CSV 文件:
"Ip","Sites"
"127.0.0.1",10
"127.0.0.2",23
"127.0.0.3",50
我需要将“127.0.0.2”行的值 23 更改为 30。
我使用 csv 库:import csv
这是打开 csv 文件,更改内存中的值,然后将更改写回磁盘的解决方案。
r = csv.reader(open('/tmp/test.csv')) # Here your csv file
lines = list(r)
行内容:
[['Ip', 'Sites'],
['127.0.0.1', '10'],
['127.0.0.2', '23'],
['127.0.0.3', '50']]
修改值:
lines[2][1] = '30'
行内容:
[['Ip', 'Sites'],
['127.0.0.1', '10'],
['127.0.0.2', '30'],
['127.0.0.3', '50']]
现在我们只需要将它写回文件
writer = csv.writer(open('/tmp/output.csv', 'w'))
writer.writerows(lines)
您可以使用名为 pandas 的非常强大的库。这是示例。
import pandas as pd
df = pd.read_csv("test.csv")
df.head(3) #prints 3 heading rows
输出:
Ip Sites
0 127.0.0.1 10
1 127.0.0.2 23
2 127.0.0.3 50
现在,如果要更改第一行“站点”列中的值,请运行:
df.set_value(1, "Sites", 30)
如果要更改所有值,其中“Ip”等于 127.0.0.2,请运行:
df.loc[df["Ip"]=="127.0.0.2", "Sites"] = 30
最后,保存值:
df.to_csv("test.csv", index=False)
您不能真正替换现有文件中的值。相反,您需要:
您还可以做的是逐行读取现有文件,将其写入新文件,同时动态替换值。完成后,关闭两个文件,删除原始文件并重命名新文件。
接受的答案的替代方法是:
fileinput
withinplace=True
就地修改文件csv.DictReader
通过标题而不是索引访问列(仅当 CSV 具有标题时才有效)测试 CSV:
Ip,Sites
127.0.0.1,10
127.0.0.2,23
127.0.0.3,50
测试代码:
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"]]))
主要区别在于您不必像inplace=True
在幕后那样手动打开输入文件并创建输出文件:
可选的就地过滤:如果关键字参数
inplace=True
被传递给fileinput.input()
构造FileInput
函数,则文件被移动到备份文件,标准输出被定向到输入文件(如果与备份文件同名的文件已经存在,它将被静默替换)。这使得编写一个过滤器来重写其输入文件成为可能。
循环逐行遍历 CSV(标题行除外),因此您可以对每一行进行所需的任何处理。
如果您仍想保留原始文件,您可以传入一个backup=".backup"
以便fileinput
创建一个test.csv.backup文件。
另外,请注意,通过就地编辑,“标准输出被定向到输入文件”,因此print(..)
将其打印到文件而不是命令行。如果要实际打印到控制台,则需要指定stderr
为 in print(..., file=sys.stderr)
。