首页 > 解决方案 > 在嵌套列表中读取 CSV 并需要修复 - 需要更有效的方式

问题描述

问题: 我的程序读取一个 CSV 文件并生成一个嵌套列表(因为没有换行符),之后我需要“修复”该列表,然后才能更进一步。该代码有效,但我正在努力寻找更有效的方法,并对任何建议感兴趣。

细节:

我的程序读取具有以下格式的 CSV 文件:

hakcke39475728,fjfjalcl689920,vjgjvkv848291, ...

所以每个项目都包含字母和数字,以逗号作为分隔符,中间没有新行。我使用 csv 读取文件并将结果放入列表中:

import csv

result = []
with open("input.csv", "r", newline="") as f:
    reader = csv.reader(f, delimiter=",", quotechar='"')
    result = list(reader)

由于没有换行符,结果是一个嵌套列表,格式如下:

[['hakcke39475728', 'fjfjalcl689920', 'vjgjvkv848291', '...'], []]

在此之后,我需要“清理”并执行一个额外的步骤 - 一个 for 循环 - 以取消嵌套列表:

output_final = [] 
for item in result[0]:
    output_final.append(item)

最终得到我需要的输出:

['hakcke39475728', 'fjfjalcl689920', 'vjgjvkv848291', '...']

什么是更有效的方法?

我不知道如何以不同的方式读取 CSV,以免生成嵌套列表。AFAIK 无法将逗号设置为 EOL 字符(这将解决我的问题,因为我在输入中的值之间没有行尾。

可能相关的问题:

标签: pythonperformancecsv

解决方案


在此之后,我需要“清理”并执行一个额外的步骤 - 一个 for 循环 - 以取消嵌套列表:

无需将项目一一复制到新列表中。

output_final = result[0]

或者/在更多上下文的情况下,假设您的 CSV 文件实际上只包含一行数据:

import csv

with open("input.csv", "r", encoding="utf8", newline="") as f:
    reader = csv.reader(f, delimiter=",", quotechar='"')
    result = next(reader)

csv 阅读器是一个迭代器——它迭代 CSV 文件中的行。通常你会在for循环中使用迭代器:

    for row in reader:
        ...

与列表的主要区别在于您不能直接访问迭代器的元素:reader[0]不起作用。但是该next()函数每次调用它时都会从迭代器中检索下一个元素。

在这种情况下,next(reader)只调用一次,因此您将获得数据的第一“行”。

关于newline="". 这并不意味着没有换行符。这意味着该csv模块将为您处理换行符并自动适应 Windows、Mac 或 *nix 样式的换行符。在处理csv模块时,您应该始终打开文件newline=""


推荐阅读