【问题标题】:Python 3.4 : match from csv and return new csv with matched valuesPython 3.4:从 csv 匹配并返回具有匹配值的新 csv
【发布时间】:2015-06-11 14:30:07
【问题描述】:

问题

如何扫描 reader csv 以查找 reader2 csv 中的任何项目并返回具有匹配信息的新 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)

【问题讨论】:

  • @tobias_k 有什么建议吗?

标签: python csv python-3.x


【解决方案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 的每一行,而不是每一列。

one 行读入内存,然后循环遍历:

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)

请注意,我在open() 调用中添加了newline='' 参数; 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 回显。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多