比较和附加Python中的.csv文件
我有2.csv文件,我想比较和追加。假设第1列文件1中有数字。我在第1列文件2中有一组类似的数字——但顺序不同,并非所有数字都存在。 我想搜索文件1第1列,看看是否有与第1列文件2中的数字匹配的项。如果存在匹配项,我希望通过将列添加到匹配的编号,将文件2中的信息附加到文件1中。 我还消除了输入文件中的任何空行 例如:比较和附加Python中的.csv文件,python,csv,Python,Csv,我有2.csv文件,我想比较和追加。假设第1列文件1中有数字。我在第1列文件2中有一组类似的数字——但顺序不同,并非所有数字都存在。 我想搜索文件1第1列,看看是否有与第1列文件2中的数字匹配的项。如果存在匹配项,我希望通过将列添加到匹配的编号,将文件2中的信息附加到文件1中。 我还消除了输入文件中的任何空行 例如: File 1 Number Name EmailAddress 1 Jenny jj@ymail.com 2 Josh jh@ymail.
File 1
Number Name EmailAddress
1 Jenny jj@ymail.com
2 Josh jh@ymail.com
3 Tony ty@gmail.org
4 Jeff jf@youtube.cc
File2
Number Address
4 123 Walnut St
1 17 Yerlington Wy
7 420 St B
Output File
Number Name EmailAddress Address
4 Jeff jf@youtube.cc 123 Walnut St
1 Jenny jj@ymail.com 17 Yerlington Wy
7 NO ENTRY
这是我到目前为止的代码,除了附加正确的信息之外,它似乎做了所有的事情
import csv
f1 = file('inFile.csv', 'rb')
f2 = file('inFile2', 'rb')
f3 = file('outFile.csv', 'wb')
c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)
masterlist = [row for row in c2]
for hosts_row in c1:
row = 1
found = False
for master_row in masterlist:
results_row = hosts_row
end_row = masterlist
if any(hosts_row):
if hosts_row[0] == master_row[0]:
results_row.append(end_row[row][1])
found = True
break
if not found:
results_row.append('NO ENTRY')
if any(hosts_row):
c3.writerow(results_row)
f1.close()
f2.close()
f3.close()
首先,您的csv文件中没有分隔符,我必须这样重写它们(逗号分隔符): infle.csv:
Number,Name,EmailAddress
1,Jenny,jj@ymail.com
2,Josh,jh@ymail.com
3,Tony,ty@gmail.org
4,Jeff,jf@youtube.cc
inFile2.csv:
Number,Address
4,123 Walnut St
1,17 Yerlington Wy
7,420 St B
那么您的代码中就没有什么问题了:
- 您缺少空主行的检查
- 奇怪的变量end\u row正在做一些您不想做的事情,实际上是无用的,因为您确实想追加
主\u row[1]
- 未找到
位于错误的块中,因此多次追加“无条目”的条件
- 存在未使用的变量
行
- (只是增强)当文件的变量超出范围时,python将为您关闭文件,因此您可以删除close()调用
import csv
f1 = file('inFile.csv', 'rb')
f2 = file('inFile2.csv', 'rb')
f3 = file('outFile.csv', 'wb')
c1 = csv.reader(f1)
c2 = csv.reader(f2)
c3 = csv.writer(f3)
masterlist = [row for row in c2]
for hosts_row in c1:
found = False
for master_row in masterlist:
results_row = hosts_row
if hosts_row and master_row:
if hosts_row[0] == master_row[0]:
results_row.append(master_row[1])
found = True
break
if not found:
results_row.append('NO ENTRY')
if any(hosts_row):
c3.writerow(results_row)
输出文件:
Number,Name,EmailAddress,Address
1,Jenny,jj@ymail.com,17 Yerlington Wy
2,Josh,jh@ymail.com,NO ENTRY
3,Tony,ty@gmail.org,NO ENTRY
4,Jeff,jf@youtube.cc,123 Walnut St
HTH另一种观点(这一种产生了您所介绍的输出,但我想Tomás的输出就是您所描述的):
几点注意:
您应该使用
打开
而不是文件
;在文件模式下,b
用于二进制文件(通过在文本模式下打开,可以进行行终止转换)。还有更多,但已经解决了 这些列是用空格还是制表符分隔的?谢谢您的输入!我在发布后意识到有一些bug,所以感谢您指出这些bug。但当我使用您的代码时,由于某种原因,而不是正确的地址,所有地址都显示为地址或无条目。我只是得到了要展示的标题,而不是正确的单元。有什么见解吗?嗯,这很奇怪,它对我很有用(生成我粘贴的“输出文件”)。地址附加在第行results\u row.append(master\u row[1])
上,因此可以尝试在它之前打印“master\u row”和“master\u row[1]”,以查看实际情况。再次感谢。实际上,这次是文件本身在我的计算机上被破坏了!当我重新保存文件时,一切都很顺利。
import csv
def read_file(path):
with open(path) as fh:
data = csv.reader(fh)
return [row for row in data if row]
def match(l1, l2):
result = []
for i in l2:
match = False
for j in l1:
if i[0] == j[0]:
row = j + i[1:]
match = True
break
if not match:
row = [i[0], "NO ENTRY"]
result.append(row)
return result
if __name__ == '__main__':
l1 = read_file("inFile.csv")
l2 = read_file("inFile2")
result = match(l1, l2)
of = open('outFile.csv', 'w')
writer = csv.writer(of)
writer.writerows(result)
of.close()