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)
Dar*_*mas 14
您无法真正替换现有文件中的值.相反,你需要:
您还可以做的是逐行读取现有文件,将其写入新文件,同时立即替换值.完成后,关闭两个文件,删除原始文件并重命名新文件.
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)
已接受答案的替代方法是:
fileinputwithinplace=True就地修改文件csv.DictReader通过标题而不是索引访问列
测试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(..)打印到文件而不是命令行。如果要实际打印到控制台,则需要stderr在print(..., file=sys.stderr).
| 归档时间: |
|
| 查看次数: |
63985 次 |
| 最近记录: |