【问题标题】:Python, How to make a nested loop works with multiple columns csv files?Python,如何使嵌套循环适用于多列 csv 文件?
【发布时间】:2020-12-20 16:45:25
【问题描述】:

我是 Python 新手,我想使用来自多列 CSV 文件的数据,一行一行地运行一个函数,每次运行之间会有一些延迟。

这是我想要实现的:

  1. 从一个范围内的第一个 CSV 文件读取(例如,第 0 行到第 3 行)

  2. 使用一行的数据,把右边的参数部分放在函数里面,有些延迟,下一行也一样。

  3. 一些延迟,然后转到下一个 CSV 文件,直到最后一个 CSV 文件。

我已尝试以下代码,但无法正常工作。以下代码适用于一列 CSV 文件。

我想用 CSV 文件中的数据填充 4 个参数, 使用与函数内的参数名称相同的列标题名称。

示例 csv 文件:

img_path,desc_1 title_1,link_1
site.com/image22.jpg,someTitle,description1,site1.com
site.com/image32.jpg,someTitle,description2,site2.com
site.com/image44.jpg,someTitle,description3,site3.com
from abc.zzz  import xyz
path_id_map = [
    {'path':'file1.csv', 'id': '12345678'},
    {'path':'file2.csv', 'id': '44556677'}
    {'path':'file3.csv', 'id': '33377799'}
    {'path':'file4.csv', 'id': '66221144'}]
s_id = None
for pair in path_id_map:
    with open(pair['path'], 'r') as f:
        for i in range(0, 3):      
            zzz.func1(img_path=f.readline().rstrip(','), title_1=f.readline().rstrip(','), 
            desc_1=f.readline().rstrip(','), link_1=f.readline().rstrip(','), B_id=pair['id'], 
            s_id=s_id)
            return zzz.func1(img_file=img_path, title_1=title_1, desc_1=desc_1, 
                 link_1=link_1, B_id=B_id, s_id=s_id)
            time.sleep(25) 

感谢您的帮助。

【问题讨论】:

标签: python python-3.x nested-loops


【解决方案1】:
  • 每次您拨打readline() 时,您都会转到下一行。因此,首先将该行保存到一个变量中,然后对其进行处理。
  • rstrip 只删除字符串边缘的字符。由于您没有尾随逗号,因此在您的代码中使用 rstrip 无效。您似乎打算使用 split 方法代替以逗号分隔的不同部分。
for pair in path_id_map:
    with open(pair['path'], 'r') as f:
        next(f)  # skip first header line
        for _ in range(0, 3):      
            line = next(f)
            img_path, desc_1, title_1, link_1 = map(str.strip, line.split(','))
            zzz.func1(img_path=img_path, title_1=title_1, desc_1=desc_1, 
                      link_1=link_1, B_id=pair['id'], s_id=s_id)

但无需手动解析 csv 文件。相反,您可以使用内置的csv 模块,该模块具有DictReader,它将每一行读取到一个dict,其中键是标题,值是具有该标题的每一列的值。这将允许您简单地unpack the row into the function call:

import csv

for pair in path_id_map:
    with open(pair['path'], 'r') as f:
        reader = csv.DictReader(f)
        for _ in range(0, 3):      
            line = next(reader)
            zzz.func1(B_id=pair['id'], s_id=s_id, **line)

【讨论】:

  • 感谢您的回复,我尝试了这两个代码,如果我向前推进返回行(缩进),我会在“返回”Return outside function 上收到错误我得到unexpected indent
  • 那是因为return 只能在函数中...你希望它在函数之外做什么?
  • 谢谢,我的错,我尝试了上面的代码,现在我得到错误:FileNotFoundError: [Errno 2] No such file or directory: "'img_path '" 所以我正在检查有什么问题。
  • 这里有一些问题。第一行是标题所以我们需要跳过它,而且似乎有空格。检查修改后的代码。但无论如何,你为什么不使用第二个?它更简单,并且已经自动跳过标题...
  • 感谢您的代码和帮助,现在代码工作正常,第二个代码不起作用,因为它跳过了标题,结果我得到变量未定义错误,运行第一个代码给我太多值解包的错误,因为我的 csv 文件的描述中有几个逗号,分隔符也是逗号,所以我将分隔符更改为半逗号并解决了问题。
猜你喜欢
  • 2016-11-15
  • 1970-01-01
  • 2014-08-26
  • 2018-07-09
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
相关资源
最近更新 更多