【问题标题】:Reading single Row of CSV per Loop in Python在 Python 中每个循环读取单行 CSV
【发布时间】:2020-09-13 03:16:45
【问题描述】:

Python3.7 CSV

我已经重新构建了这个问题以使其更加明显 - 我试图在循环中的每次传递时从 CSV 访问特定行。

所以在第一个循环中取第 1 行

第二次循环出现在第 2 行

循环第三次出现,从 CSV 中取出第 3 行

test.csv:

How To Write Your First Article Heading,
Here's The Important Second Article Heading,
Three is The Magic Number,

脚本:

import csv

name = 'Article Heading'


for i in range(3):

    with open ('test.csv', 'r') as file:
        reader = csv.reader(file)
        for i in range(3):
            try:
                csv_row = ' '.join(next(reader))
            except StopIteration:
                break

            articletitle = (name + ' | ' + csv_row)
            print(articletitle)

print('THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV')

以上输出:

Article Heading | How To Write Your First Article Heading 
Article Heading | Here's The Important Second Article Heading 
Article Heading | Three is The Magic Number 
Article Heading | How To Write Your First Article Heading 
Article Heading | Here's The Important Second Article Heading 
Article Heading | Three is The Magic Number 
Article Heading | How To Write Your First Article Heading 
Article Heading | Here's The Important Second Article Heading 
Article Heading | Three is The Magic Number 
THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV
[Finished in 0.3s]

期望的输出:

Article Heading | How To Write Your First Article Heading 
THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV
Article Heading | Here's The Important Second Article Heading 
THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV
Article Heading | Three is The Magic Number
THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV

如果人们认为我把这完全搞砸了,我愿意接受严厉的批评。我保证我已经找到了解决方案,但没有快乐。

【问题讨论】:

  • 嗨 ColumnS,欢迎来到 stackoverflow。您能否编辑您的问题以更多地关注问题并删除所有介绍/分心部分? (codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question)。一旦你的问题被剥离到只有必要的部分,我会很乐意调查它(现在我很难通过它):)
  • 谢谢@puchal - 我已经把它剥离了一点,只留下问题的上下文和问题,我可以用外行的术语来描述 - 感谢您的帮助
  • 与其描述它所说的一切,不如给出几行预期的输入和输出作为示例。实际上,描述听起来像是您想遍历 CSV 数据的列,但称它们为行??
  • 非常感谢@puchal - 我真的很感激。您的分析使我能够更好地表达我的问题,并且我可以根据您所写的内容来展示它 - 而不是我的混乱解释:上面的编辑:
  • 感谢@Mark Tolonen - 在上面适当地注明和编辑

标签: python-3.x string loops csv dynamic


【解决方案1】:

你遇到的问题是读取你使用list(csv.reader(infile))的csv文件

csv.reader(infile) 是一个迭代器,将在您的文件中逐行执行。

如果我正确理解了您的问题,您可以通过两种方式解决您的问题。

一个循环使用for _ in range(5) 循环 5 次:

with open ('test.csv', 'r') as file:
    reader = csv.reader(file)
    for i in range(5):
        try:
            csv_row = ' '.join(next(reader))
            print(csv_row)
        except StopIteration:
            break

(如果 csv 文件少于 5 行,您需要处理 StopIteration 异常)

或者您可以遍历 csv 文件的每一行并在循环的第 5 次迭代后中断:

with open ('test.csv', 'r') as file:
    reader = csv.reader(file)
    for i, line in enumerate(reader):
        if i == 5:
            break
        row = ' '.join(line)
        print(row)

在这个解决方案中,不需要处理任何异常,但是如果你想在第 5 次迭代后中断循环,你需要有一些 if 语句来查看当前正在进行的迭代。

【讨论】:

    【解决方案2】:

    遍历行很简单。在您的测试用例中,您甚至不需要 csv 模块,但我会使用您的测试用例:

    代码:

    import csv
    
    name = 'Article Heading'
    
    # newline='' should be used per documentation for csv.reader.
    with open ('test.csv', newline='') as file:
        reader = csv.reader(file)
        for row in reader:
            articletitle = name + ' | ' + row[0]
            print(articletitle)
            print('THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV')
    

    输出:

    Article Heading | How To Write Your First Article Heading
    THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV
    Article Heading | Here's The Important Second Article Heading
    THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV
    Article Heading | Three is The Magic Number
    THEN WE GO OFF AND DO SOMETHING BEFORE GOING BACK FOR THE NEXT ROW IN THE CSV
    

    编辑

    要遍历列,读取所有数据并将列转置为行:

    test.csv:

    1,4,7
    2,5,8
    3,6,9
    

    代码:

    import csv
    
    name = 'Article Heading'
    
    # newline='' should be used per documentation for csv.reader.
    with open ('test.csv', newline='') as file:
        rows = list(csv.reader(file))
    
    columns = zip(*rows) # transpose rows/columns
    
    for column in columns:
        for item in column:
            article_title = f'{name} | {item}'
            print(article_title)
    

    输出:

    Article Heading | 1
    Article Heading | 2
    Article Heading | 3
    Article Heading | 4
    Article Heading | 5
    Article Heading | 6
    Article Heading | 7
    Article Heading | 8
    Article Heading | 9
    

    【讨论】:

    • 感谢@Mark Tolonen,非常感谢您花时间看它。您建议的代码非常接近我想要实现的目标,但也许我更混淆了 - 尽管在我的理解中,如果我运行上面的代码,它将打印您给出的输出,但是下次循环出现时它会打印再次相同的输出。我想我想要得到的是 {code}articletitle = name + ' | ' + row[*]{code} 所以第一轮它打印第 0 行,(然后我取第 0 行并在脚本中使用它)然后下次我想使用相同的代码,但这次作用于第 1 行。
    • @ColumnS 所以你正在调用列行。一个具体的例子会有所帮助,但要遍历列,您可以在整个文件中读取并转置数据。我会更新一个例子。
    猜你喜欢
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多