Python循环遍历CSV文件及其列

Posted

技术标签:

【中文标题】Python循环遍历CSV文件及其列【英文标题】:Python Looping through CSV files and their columns 【发布时间】:2018-02-07 10:17:12 【问题描述】:

所以我已经看到这里完成了其他问题,但我仍然有点困惑。过去几天我一直在学习 python3,我想我会开始做一个项目来真正弄脏我的手。我需要遍历一定数量的 CSV 文件并对这些文件进行编辑。通常,我无法转到特定列以及 python 中的循环。我习惯了约定(int i = 0; i

import os
import csv

pathName = os.getcwd()

numFiles = []
fileNames = os.listdir(pathName)
for fileNames in fileNames:
    if fileNames.endswith(".csv"):
        numFiles.append(fileNames)

for i in numFiles:
    file = open(os.path.join(pathName, i), "rU")
    reader = csv.reader(file, delimiter=',')
    for column in reader:
        print(column[4])

我的问题在于这一行:

for column in reader:
        print(column[4])

所以在文档中它说 column 是变量,而 reader 是我正在循环的内容。但是当我写 4 我得到这个错误:

IndexError: list index out of range

这是什么意思?如果我写 0 而不是 4,它会打印出每个 CSV 文件的第 0 列单元格 0 中的所有值。我基本上需要它遍历每个 CSV 文件的第一行并找到一个特定的值,然后遍历整个列。提前致谢!

【问题讨论】:

这意味着在您的一个文件中的某处,没有任何第 5 列。 for column in reader?不是for row in reader吗?并且不要忘记使用with 来确保文件在处理后关闭:with open(os.path.join(pathName, i), "rU") as file: 太棒了,感谢所有的答案! @azalea 为什么是 5?我试图了解 for 循环是如何工作的。 造成这种情况的一个常见原因是您的文件中某处有一个空行。例如第一行或最后一行。你可以添加类似if len(row) == 4: 不应该是for aFileName in fileNames:而不是for fileNames in fileNames: 【参考方案1】:

可能是您的 .csv 文件中没有 5 列。

Python 是 base0,这意味着它从 0 开始计数,因此第一列为 column[0],第二列为 column[1]。

你也可能想改变你的

for column in reader:

for row in reader:

因为 reader 遍历的是行,而不是列。

此代码循环遍历每一行,然后是该行中的每一列,以便您查看每个单元格的内容。

for i in numFiles:
    file = open(os.path.join(pathName, i), "rU")
    reader = csv.reader(file, delimiter=',')
    for row in reader:
        for column in row:
            print(column)
            if column=="SPECIFIC VALUE":
                #do stuff

【讨论】:

是的,我需要阅读更多文档。现在我明白发生了什么,谢谢!我真的很喜欢你和多伦科恩的回答。【参考方案2】:

欢迎来到 Python!我建议你打印一些调试信息。

您可以将其添加到您的打印循环中:

for row in reader:
    try:
        print(row[4])
    except IndexError as ex:
        print("ERROR: %s in file %s doesn't contain 5 colums" % (row, i))

这将打印坏行(作为列表,因为这是它们在 CSVReader 中的表示方式),因此您可以修复 CSV 文件。

一些注意事项:

    在 Python 中通常使用 snake_case 而不是 camelCase 适当地命名您的变量(csv_filename 而不是 irow 而不是 column 等) 使用with close 处理文件 (read more)

享受吧!

【讨论】:

是的!谢谢!我完全忘记了调试消息....我真傻。是的,我已经习惯了camelCase,但我会切换到snake_case。谢谢!我真的很喜欢你和 Philip556677 的回答。

以上是关于Python循环遍历CSV文件及其列的主要内容,如果未能解决你的问题,请参考以下文章

Python 循环遍历 csv 文件中的 url 返回 \ufeffhttps://

遍历 for 循环并将检索到的数据保存在每个循环的唯一 csv 文件中 | Python

Python通过列搜索

Python:从 CSV 文件中的列创建多个文本文件

使用 Talend 循环遍历 .csv 文件

gh读取csv文件