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"]]))
循环逐行遍历CSV(标题行除外),因此您可以对每一行执行任何所需的处理。 如果您仍然希望保留原始文件,可以传入一个backup=".backup",这样fileinput就会创建一个 test.csv.backup 文件。 另外,请注意,对于就地编辑,“standard output is directed to the input file",因此print(..)将其打印到文件而不是命令行。如果您希望实际打印到控制台,则需要将stderr指定为print(..., file=sys.stderr)。
4条答案
按热度按时间kuuvgm7e1#
此解决方案打开csv文件,更改内存中的值,然后将更改写回磁盘。
行内容:
修改值:
行内容:
现在我们只需将其写回文件
k4ymrczo2#
你可以使用一个非常强大的库pandas。下面是这个例子。
输出量:
现在,如果要更改第1行中“站点”列的值,请运行:
如果要更改所有值(其中“Ip”等于127.0.0.2),请运行:
最后,保存值:
8dtrkrch3#
您实际上无法替换现有文件中的值。相反,您需要:
1.读入现有文件
1.更改内存中的文件
1.写出新文件(覆盖现有文件)
你也可以一行一行地读入现有的文件,把它写到一个新的文件中,同时动态地替换值。完成后,关闭两个文件,删除原始文件并重命名新文件。
3pvhb19x4#
accepted answer的替代方法是:
fileinput
与inplace=True
配合使用可就地修改文件csv.DictReader
通过标题而不是索引访问列(仅当CSV具有标题时才有效)测试CSV:
测试代码:
主要的区别在于,您不必手动打开输入文件并创建输出文件,因为
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)
。