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

ws51t4hk  于 2022-12-06  发布在  Python
关注(0)|答案(4)|浏览(208)

我需要一种方法来更改CSV文件中某列的特定值。例如,我有一个CSV文件:

"Ip","Sites"
"127.0.0.1",10
"127.0.0.2",23
"127.0.0.3",50

并且我需要将“www.example.com“行的值23更改为30127.0.0.2。
我使用csv库:import csv

kuuvgm7e

kuuvgm7e1#

此解决方案打开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)
k4ymrczo

k4ymrczo2#

你可以使用一个非常强大的库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

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

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)
8dtrkrch

8dtrkrch3#

您实际上无法替换现有文件中的值。相反,您需要:
1.读入现有文件
1.更改内存中的文件
1.写出新文件(覆盖现有文件)
你也可以一行一行地读入现有的文件,把它写到一个新的文件中,同时动态地替换值。完成后,关闭两个文件,删除原始文件并重命名新文件。

3pvhb19x

3pvhb19x4#

accepted answer的替代方法是:

  • fileinputinplace=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 文件。
另外,请注意,对于就地编辑,“standard output is directed to the input file",因此print(..)将其打印到文件而不是命令行。如果您希望实际打印到控制台,则需要将stderr指定为print(..., file=sys.stderr)

相关问题