如何通过将csv文件与python中的其他csv文件进行比较来删除和替换csv文件中的列?
Posted
技术标签:
【中文标题】如何通过将csv文件与python中的其他csv文件进行比较来删除和替换csv文件中的列?【英文标题】:How to delete and replace columns in a csv file by comparing it to other csv files in python? 【发布时间】:2019-06-20 14:58:28 【问题描述】:我正在编写一个 python 代码来搜索、删除和替换 csv 文件中的列 我有 3 个文件。
输入.csv:
aaaaaaaa,bbbbbb,cccccc,ddddddd
eeeeeeee,ffffff,gggggg,hhhhhhh
iiiiiiii,jjjjjj,kkkkkk,lllllll
mmmmmmmm,nnnnnn,oooooo,ppppppp
qqqqqqqq,rrrrrr,ssssss,ttttttt
uuuuuuuu,vvvvvv,wwwwww,xxxxxxx
删除.csv:
aaaaaaaa
eeeeeeee
uuuuuuuu
替换.csv:
iiiiiiii,11111111,22222222
mmmmmmmm,33333333,44444444
这是我的代码:
input_file='input.csv'
new_array=[]
for line in open(input_file):
data=line.split(',')
a==data[0]
b=data[1]
c=data[2]
d=data[3]
for line2 in open(delete):
if (name in line2)==True:
break
else:
for line1 in open(replace):
data1=line1.split(',')
aa=data1[0]
replaced_a=data1[1]
repalced_b=data1[2]
if (data[0]==data1[0]):
data[0]=data1[1]
data[2]=data1[2]
new_array=data
print(new_array)
else:
new_array=data
我的逻辑是:
1)open input.csv read line by line
2)load elements into an array
3)compare first element with entire delete.csv
4)if found in delete.csv then do nothing and take next line in array
5)if not found in delete.csv then compare with replace.csv
6)if the first element is found in the first column of replace.csv then replace the element by the corresponding second column of replace.csv and the second element with the corresponding 3rd third column of repalce.csv.
7)load this array into a bigger 10 element array.
所以我想要的输出是:
11111111,22222222,kkkkkk,lllllll
33333333,44444444,oooooo,ppppppp
qqqqqqqq,rrrrrr,ssssss,ttttttt
所以现在我面临以下问题: 1) replace.csv 或 delete.csv 中不存在的行不会被打印 2)我的 input.csv 可能在一个条目中包含换行符,因此逐行阅读是一个问题,但是可以肯定的是,分布在不同行上的数据在引号之间。 例如:
aaaaa,bbbb,ccccc,"ddddddddddd
ddddddd"
11111,2222,3333,4444
感谢任何有助于将代码和我的逻辑结合在一起的帮助。
【问题讨论】:
不要自己阅读 csv - 使用module csv
- 它可以处理包含换行符的转义数据。大量关于如何修改 csv 的帖子 - f.e.这个:overwrite-a-specific-column-in-a-csv-file-using-python-csv-module
【参考方案1】:
我建议稍微改变一下:
在字典里读你想replace
的东西
将密钥设置为数据第 0 点中的内容,将值设置为替换数据的第 0 和第 1 点的内容
把你想delete
的东西读成集合
如果您的数据行以它开头:跳过行,否则将其添加到输出中。
遍历您的数据并使用这两种查找来“做正确的事”。
我稍微更改了您的数据以合并提到的“转义”数据,包括换行符:
文件创建:
with open("i.csv","w") as f:
f.write("""
aaaaaaaa,bbbbbb,cccccc,ddddddd
eeeeeeee,ffffff,gggggg,hhhhhhh
iiiiiiii,jjjjjj,kkkkkk,lllllll
"mmmm
mmmm",nnnnnn,oooooo,ppppppp
qqqqqqqq,rrrrrr,ssssss,ttttttt
uuuuuuuu,vvvvvv,wwwwww,xxxxxxx""")
with open ("d.csv","w") as f:
f.write("""
aaaaaaaa
eeeeeeee
uuuuuuuu""")
with open ("r.csv","w") as f:
f.write("""
iiiiiiii,11111111,22222222
"mmmm
mmmm",33333333,44444444""")
程序:
import csv
def read_file(fn):
rows = []
with open(fn) as f:
reader = csv.reader(f, quotechar='"',delimiter=",")
for row in reader:
if row: # eliminate empty rows from data read
rows.append(row)
return rows
# create a dict for the replace stuff
replace = x[0]:x[1:] for x in read_file("r.csv")
# create a set for the delete stuff
delete = set( (row[0] for row in read_file("d.csv")) )
# collect what we need to write back
result = []
# https://docs.python.org/3/library/csv.html
with open("i.csv") as f:
reader = csv.reader(f, quotechar='"')
for row in reader:
if row:
if row[0] in delete:
continue # skip data row
elif row[0] in replace:
# replace with mapping, add rest of row
result.append(replace[row[0]] + row[2:]) # replace data
else:
result.append(row) # use as is
# write result back into file
with open ("done.csv", "w", newline="") as f:
w = csv.writer(f,quotechar='"', delimiter= ",")
w.writerows(result)
检查结果:
with open ("done.csv") as f:
print(f.read())
输出:
11111111,22222222,kkkkkk,lllllll
33333333,44444444,oooooo,ppppppp
qqqqqqqq,rrrrrr,ssssss,ttttttt
独库:
csv.writer/csv.reader【讨论】:
真的很感谢这个。你的方法似乎更强大。让我尝试一下,然后我会告诉你的。 问题是在执行操作后我想将数组转储到另一个数组中,该数组具有更多元素,其中一些元素是硬编码的,但 csv.writer 创建了一个 4 列 csv。有什么解决办法吗? @anj 这改变了这个答案试图解决的这个问题的“规则/框架”。如果您还有其他问题,请点击 按钮提出问题。您可以参考这个问题/或答案。确保另一个问题是“不言自明的”,足以单独提出一个问题。您可能想先摆弄result
- 它包含作为列表列表的所有数据 - 每个内部列表都是一行 - 您可以扩展/附加到它以包含您的“其他”数据,然后再将其保存为 csv。不过,请务必先搜索 SO。
实际上我已经在我的问题中提到了这个要求。但不用担心你说我会试着摆弄结果来附加其他数据。
我试图通过使用 lower() 打开文件来使比较不区分大小写。知道如何正确实施吗?以上是关于如何通过将csv文件与python中的其他csv文件进行比较来删除和替换csv文件中的列?的主要内容,如果未能解决你的问题,请参考以下文章