2015-06-11 35 views
-1

问题

返回新的CSV我如何可以扫描在reader2 CSV任何物品读者CSV和与匹配的信息返回一个新的CSV文件。的Python 3.4:从CSV匹配,并与匹配的值

Reader2 csv格式

66740,1800,1001463,1467373,896159 

读者csv格式

1001385|NORTHWEST PIPE CO|10-Q|2015-05-06|edgar/data/1001385/0001193125-15-174814.txt 
1001426|PERICOM SEMICONDUCTOR CORP|10-Q|2015-05-05|edgar/data/1001426/0001145443-15-000628.txt 
1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001386.txt 
1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001394.txt 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001388.txt 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001390.txt 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001392.txt 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001396.txt 

目前代码

with open('newCIK.csv') as reader2: 
    reader2 = csv.reader(reader2) 

    with open('search.file') as f_in, open('SP500_10K.csv', 'w') as f_out: 
     reader = csv.reader(f_in, delimiter='|') 
     writer = csv.writer(f_out, delimiter='|') 

     for line in reader: 
      for cik in reader2: 
       if cik in line: 
        writer.writerow(line) 
+0

@tobias_k有什么建议吗? –

回答

1

您正试图把一个文件对象的列表,遍历它比一旦。没有做额外的工作就无法工作。而且,你并没有遍历一行的列;您正试图测试整行是否在其他CSV文件行中。您需要测试每个值,然后仅针对search.file CSV数据中行的最后一列。

文件对象有文件位置;当您从文件中读取时,位置会从头到尾移动。一旦在结束,它将不会再次自动移动到开始

你可以再找文件对象的开始:

with open('newCIK.csv') as reader2_file: 
    reader2 = csv.reader(reader2_file) 

    with open('search.file') as f_in, open('SP500_10K.csv', 'w') as f_out: 
     reader = csv.reader(f_in, delimiter='|') 
     writer = csv.writer(f_out, delimiter='|') 

     for line in reader: 
      reader2_file.seek(0) # rewind to the start 
      for cik in reader2: 
       if cik in line: 
        writer.writerow(line) 

然而,一遍又一遍就是读取文件。一开始你会更好地将整件事物读入记忆中。上述内容并没有解决其他问题,即您正在测试每行,而不是每个列,从newCIK.csv

阅读一个一行到内存中,然后在这个循环:

with open('newCIK.csv', newline='') as reader2: 
    reader2 = csv.reader(reader2) 
    cik_values = next(reader2) # first row 

with open('search.file', newline='') as f_in, open('SP500_10K.csv', 'w', newline='') as f_out: 
    reader = csv.reader(f_in, delimiter='|') 
    writer = csv.writer(f_out, delimiter='|') 

    for line in reader: 
     for cik in cik_values: 
      if cik in line[-1]: # test only the last column 
       writer.writerow(line) 

请注意,我在newline=''参数给open()呼叫加入; csv模块需要对换行符进行更多的控制;不这样做可能会导致Windows和处理包含换行符的值时出现问题。

演示:

>>> from io import StringIO 
>>> import csv, sys 
>>> newcik = '''\ 
... 66740,1800,1001463,1467373,896159 
... ''' 
>>> search_file = '''\ 
... 1001385|NORTHWEST PIPE CO|10-Q|2015-05-06|edgar/data/1001385/0001193125-15-174814.txt 
... 1001426|PERICOM SEMICONDUCTOR CORP|10-Q|2015-05-05|edgar/data/1001426/0001145443-15-000628.txt 
... 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001386.txt 
... 1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001394.txt 
... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001388.txt 
... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001390.txt 
... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001392.txt 
... 1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001396.txt 
... ''' 
>>> with StringIO(newcik) as reader2: 
...  reader2 = csv.reader(reader2) 
...  cik_values = next(reader2) # first row 
... 
>>> with StringIO(search_file) as f_in: 
...  reader = csv.reader(f_in, delimiter='|') 
...  writer = csv.writer(sys.stdout, delimiter='|') 
...  for line in reader: 
...   for cik in cik_values: 
...    if cik in line[-1]: # test only the last column 
...     writer.writerow(line) 
... 
1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001386.txt 
103 
1001463|Acacia Diversified Holdings, Inc.|10-K|2015-05-20|edgar/data/1001463/0001185185-15-001394.txt 
103 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001388.txt 
103 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001390.txt 
103 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001392.txt 
103 
1001463|Acacia Diversified Holdings, Inc.|10-Q|2015-05-20|edgar/data/1001463/0001185185-15-001396.txt 
103 

103号码写在每writer.writerow()呼叫的字节数,由REPL回荡。