Python csv - 替换具有指定值的任何列

时间:2017-04-05 15:56:18

标签: python csv

我有以下带有标题行的输入文件: test_in.csv

LON,LAT,NUMBER,STREET,UNIT,CITY,DISTRICT,REGION,POSTCODE,ID,HASH
-72.5708234,41.4155142,39,HICKORY LA,,,,,,,8a0df668e0d49b02
-72.5647745,41.4160301,1213,KILLINGWORTH RD,,,,,,,b3ecaab86e476f46

我需要用指定的字符串替换任何列 例如,CITY列的数据应该从“”替换为“MyCity” 我的代码只输出标题和第一行

python test_forcefld.py test_in.csv MyCity CITY out_test.csv

import csv
import sys

in_file_name = sys.argv[1]
force_data = sys.argv[2]
force_fld = sys.argv[3]
out_file_name = sys.argv[4]

# First read top row/header from input file
fieldnames = []
for filename in [in_file_name]:
  with open(filename, "rb") as f_in:
    reader = csv.reader(f_in)
    headers = next(reader)
    for h in headers:
        fieldnames.append(h)
#print headers to output file
with open(out_file_name, 'w') as fou:
    dw = csv.DictWriter(fou, delimiter=',', fieldnames=fieldnames)
    dw.writeheader()

f_in2 = open(in_file_name, "rb")
reader2 = csv.DictReader(f_in2)  # Uses the field names in this file
datarow = next(reader2)
datarow[force_fld] = force_data
with open(out_file_name, 'wa') as fou:
    dw2 = csv.DictWriter(fou, delimiter=',', fieldnames=fieldnames)
    dw2.writeheader()
    dw2.writerow(data row)

输出显示

LON,LAT,NUMBER,STREET,UNIT,CITY,DISTRICT,REGION,POSTCODE,ID,HASH
-72.5708234,41.4155142,39,HICKORY LA,,MyCity,,,,,8a0df668e0d49b02

4 个答案:

答案 0 :(得分:0)

您的代码有点难以阅读,但假设 datarow 是包含您的记录的字典:

在最后一行中,更改

dw2.writerow(datarow)

进入

dw2.writerows(datarow)

当你在这里时,你也应该考虑使用datarow.keys()作为你的字段名,以便简洁。

答案 1 :(得分:0)

这应该这样做,你只需要pandas

import pandas as pd
df = pd.read_csv(in_file_name, sep=',')
df['CITY'].fillna('MyCity', inplace=True)

并保存它:

df.to_csv(out_file_name)

答案 2 :(得分:0)

你可以尝试这样的事情来获得你想要的文件:

我假设您的输入文件名为f_input.txt,输出文件名为f_output.txt

data = list(k.rstrip().split(',') for k in open("f_input.txt", 'r'))

with open("f_output.txt", 'a+') as f:
    f.write(",".join(data[0]) + '\n')
    for k in data[1:]:
        # Modify the positions of k[:n] + your data + k[n+1]
        # if you need to handle another position
        f.write(",".join(k[:6]) + "MyCity" + ",".join(k[7:]) + "\n")

答案 3 :(得分:0)

这最终有效:

import csv
import sys

in_file_name = sys.argv[1]
force_data = sys.argv[2]
force_fld = sys.argv[3]
out_file_name = sys.argv[4]

# First read top row/header from input file
fieldnames = []
for filename in [in_file_name]:
  with open(filename, "rb") as f_in:
    reader = csv.reader(f_in)
    headers = next(reader)
    for h in headers:
        fieldnames.append(h)

f_in2 = open(in_file_name, "r")
#print headers to output file
fou = open(out_file_name, 'wa')
dw = csv.DictWriter(fou, delimiter=',', fieldnames=fieldnames)
dw.writeheader()
reader2 = csv.DictReader(f_in2)  # Uses the field names in this file
for row in reader2:
    row[force_fld] = force_data
    dw2 = csv.DictWriter(fou, delimiter=',', fieldnames=fieldnames)
    dw2.writerow(row)