在python中获取空CSV

在python中获取空CSV,python,csv,Python,Csv,我编写了一段代码,比较两个csv的数据,并将最终输出写入一个新的csv。问题是除了标题之外,没有其他内容写入csv。下面是我的代码 import csv data_3B = open('3B_processed.csv', 'r') reader_3B = csv.DictReader(data_3B) data_2A = open('2A_processed.csv', 'r') reader_2A = csv.DictReader(data_2A) l_3B_2A = [["ta

我编写了一段代码,比较两个csv的数据,并将最终输出写入一个新的csv。问题是除了标题之外,没有其他内容写入csv。下面是我的代码

import csv


data_3B = open('3B_processed.csv', 'r') 
reader_3B = csv.DictReader(data_3B)

data_2A = open('2A_processed.csv', 'r') 
reader_2A = csv.DictReader(data_2A)

l_3B_2A = [["taxable_entity_id", "return_period", "3B", "2A"]]

for row_3B in reader_3B:
    for row_2A in reader_2A:
        if row_3B["taxable_entity_id"] == row_2A["taxable_entity_id"] and row_3B["return_period"] == row_2A["return_period"]:
            l_3B_2A.append([row_3B["taxable_entity_id"], row_3B["return_period"], row_3B["total"], row_2A["total"]])


with open("3Bvs2A_new.csv", "w") as csv_file:
    writer = csv.writer(csv_file)

    writer.writerows(l_3B_2A)

csv_file.close()
我如何解决这个问题

编辑: 2A_processed.csv示例:

taxable_entity_id,return_period,total
2d9cc638-5ed0-410f-9a76-422e32f34779,072019,0
2d9cc638-5ed0-410f-9a76-422e32f34779,062019,0
2d9cc638-5ed0-410f-9a76-422e32f34779,082019,0
e5091f99-e725-44bc-b018-0843953a8771,082019,0
e5091f99-e725-44bc-b018-0843953a8771,052019,41711.5
920da7ba-19c7-45ce-ba59-3aa19a6cb7f0,032019,2862.94
410ecd0f-ea0f-4a36-8fa6-9488ba3c095b,082018,48253.9
3B_处理过的样品:

taxable_entity_id,return_period,total
1e5ccfbc-a03e-429e-b79a-68041b69dfb0,072017,0.0
1e5ccfbc-a03e-429e-b79a-68041b69dfb0,082017,0.0
1e5ccfbc-a03e-429e-b79a-68041b69dfb0,092017,0.0
f7d52d1f-00a5-440d-9e76-cb7fbf1afde3,122017,0.0
1b9afebb-495d-4516-96bd-1e21138268b7,072017,146500.0
1b9afebb-495d-4516-96bd-1e21138268b7,082017,251710.0

如果数据帧大小相等,则可以使用熊猫执行此操作,如下所示:

reader_3B=pd.read_csv('3B_processed.csv')
reader_2A=pd.read_csv('2A_processed.csv')

l_3B_2A=row_3B[(row_3B["taxable_entity_id"] == row_2A["taxable_entity_id"])&(row_3B["return_period"] == row_2A["return_period"])]

l_3B_2A.to_csv('3Bvs2A_new.csv') 

我将您的代码放入一个文件test.py,并创建测试文件来模拟您的CSV

$ python3 ./test.py
$ cat ./3Bvs2A_new.csv 
taxable_entity_id,return_period,3B,2A
1,2,3,2
$ cat ./3B_processed.csv 
total,taxable_entity_id,return_period,3B,2A
3,1,2,3,4
3,4,3,2,1

$ cat ./2A_processed.csv 
taxable_entity_id,return_period,2A,3B,total
1,2,3,4,2
4,3,2,1,2
因此,正如您所看到的,列的顺序并不重要,因为它们是使用dict读取器正确访问的,并且如果第一行与您的代码匹配,那么您的代码可以工作,但是在处理第一个文件中的第一行之后,第二个csv文件中没有留下任何行。我建议制作一个字典,如果有实体id和返回周期元组值,则处理第一个csv文件,将总计添加到dict中,然后运行第二个并查找它们

row_lookup = {}
for row in first_csv:
    rowLookup[(row['taxable_entity_id'], row['return_period'])] = row['total']

for row in second_csv:
    if (row['taxable_entity_id'],row['return_period']) in row_lookup.keys():
        newRow = [row['taxable_entity_id'], row['return_period'], row['total'] ,row_lookup[(row['taxable_entity_id'],row['return_period']] ]

当然,只有当应税实体ID和返回期对始终是唯一的时,这才有效。。。如果不知道任务的确切性质和csv的完整格式,很难说您应该做什么。

代码中的
csv.DictReader
对象只能读取文件一次,因为它们是从文件对象(使用
open
创建)读取的。因此,通过外循环的第二次和后续时间,内循环不会运行,因为读卡器中不再有
row_2A
——读卡器在第一次之后位于文件末尾

$ python3 ./test.py
$ cat ./3Bvs2A_new.csv 
taxable_entity_id,return_period,3B,2A
1,2,3,2
$ cat ./3B_processed.csv 
total,taxable_entity_id,return_period,3B,2A
3,1,2,3,4
3,4,3,2,1

$ cat ./2A_processed.csv 
taxable_entity_id,return_period,2A,3B,total
1,2,3,4,2
4,3,2,1,2
最简单的修复方法是先将每个文件读入一个列表。我们可以制作一个助手函数来处理此问题,并确保文件正确关闭:

def lines_of_csv(filename):
    with open(filename) as source:
        return list(csv.DictReader(source))

reader_3B = lines_of_csv('3B_processed.csv')
reader_2A = lines_of_csv('2A_processed.csv')

您是否尝试使用熊猫数据框执行此操作?您是否确定您的列表
l_3B_2A
包含您要收集的所有数据?如果
的情况在我看来可疑,那就是
。胡乱猜测,其中一个键
实体\u id
返回\u period
的末尾包含一个换行符,这就是为什么字符串的相等比较永远不起作用的原因。@BillyBonaros我如何使用pandas实现这一点?我不太擅长..@Arne,我不确定。。这两个键的末尾没有换行符。。我正在比较的两个csv是使用python生成的。我正在添加一个示例。@MohnishM如果在if之后编写一个else条件,并在其中打印第3B行和第2A行,您可能会明白为什么即使您认为应该输入if条件,也无法输入它。在我编写此脚本的早期尝试中,我这样做了。但是这需要很长时间,因为一个CSV有100万行,另一个CSV有50万行。是的,那么你需要一个更好的算法。我可以演示如何做到这一点,但使用实际的数据库要简单得多。我无法直接连接到数据库,因为有5分钟的超时和ssh隧道转发。我已经在这里问过了。。尚未收到任何有用的回复。由于您可能已经将数据库数据作为csv本地下载,也许您可以重建数据库的本地副本?嘿,我已经解决了这个问题,不再处理这个问题。也许我可以那样做。。无论如何,谢谢你的建议!这并没有解决读取文件的问题,而且还误解了循环在原始代码中的工作方式。然而,关于查找dict的建议仍然是一个好建议,也是使其有效工作的关键。等等,我明白你的意思了。我错过了环的嵌套。因此,第二个csv中的第一行与第一个csv中的任何行都不匹配,因此他没有得到任何输出。我当时正全神贯注地想弄清楚他想做什么,却没有名声去问一句话……@David。。兄弟,你救了我的命。你的方法把我的执行时间从几天缩短到几秒钟。谢谢很乐意帮忙。只要确保这是正确的输出。如果实体ID和返回周期对在每个文件中只出现一次,那么就可以了。如果它们可以出现不止一次(我不确定您对实体id的意思是什么类型的实体),那么字典将只保存第一个CSV和返回周期中具有特定id的最后一条记录,并且您将在第二个文件中获得每对一行,而不是遍历列表的所有组合的行。但我的印象是这是正确的。一个CSV有大约一百万行,而另一个有五十万行。