python - .readlines() 返回空列表(已解决)-> 使用 csv 将数据添加到特定的命名行

标签 python list csv readlines

编写了一个生成一些数据的函数后,我想添加保存它的功能。我最初使用以下代码开始,并使用“save=True”运行:

[in]
import csv
... (main body of code - all this works fine)
if save is True:
    print("Saving...")
    with open('dataset.csv', 'a+') as f:
        lines = f.readlines()
        for line in lines:
            linesplit = line.split(",")
            name_in_dataset = linesplit[0] 
            ...

            (... some code for the actual saving process - irrelevant)
            
            print("Data added successfully")

[out]
Saving...

我知道数据集文件包含这个名称并且应该保存在这里,所以我对哪里出了问题有点困惑。我开始分解代码,直到达到以下目的:

[in]
if save is True:
    print("Saving...")
    with open('dataset.csv') as f:
        lines = f.readlines()
        print(lines)

[out]
Saving...
[]

不太清楚为什么它无法读取这些行?我虽然之前使用过相同的代码来读取这个文件的行,所以我真的很困惑为什么它现在不起作用。

我尝试在代码中添加一些内容,例如f.seek(0),但这没有什么区别。我还尝试将 open 函数更改为 'a''r' 但可惜它无法读取这些行。我搜索了很多关于 .readlines() 的帖子,但找不到任何人经历过这种情况:( 我觉得我工作太久了,已经忘记了基本的基础知识Python 编码!

提前致谢<3

编辑: 根据评论中的建议,我将代码更改为:

with open('(file path)/dataset.csv', 'r') as f:
     f.seek(0)
     lines = csv.reader(f)
     print(lines)

它返回了:

Saving...
<csv.reader object at 0x7f01282c7f20>

最佳答案

我看到很多 Python 和 CSV 新手尝试使用文件模式追加,他们通常会因此陷入一些麻烦。

一般来说,我建议读取源 CSV,修改行,然后将修改后的行写入另一个文件。验证新文件的有效性后,您可以决定如何处理旧文件。

对于读取/写入 CSV,我建议使用 csv 模块的读取器和写入器。

给定 CSV:

Col1,Col2
r1c1,r1c2
r2c1,r2c2
r3c1,r3c2

使用 csv.reader(some_file) 函数为该文件创建行迭代器:

with open('input.csv',newline='',encoding='utf-8') as f:
    reader = csv.reader(f)

局部变量读取器将产生完全解码的行。可以使用 next(reader) 一次返回一行:

next(reader)
# ['Col1', 'Col2']
next(reader)
# ['r1c1', 'r1c2']

读取器返回的只是一个字符串列表。

迭代器也可以在 for 循环中使用,如 documentation shows us :

for row in reader:
    print(row)

# ['r2c1', 'r2c2']
# ['r3c1', 'r3c2']

请注意,读者从上次停下的地方继续阅读 next() 语句。而且,现在读者已经筋疲力尽——没有更多的行需要解码。尝试读取它会抛出 StopIteration 异常:

next(reader)
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# StopIteration

要获取所有行并能够循环遍历它们任意次数,请在创建读取器时使用 list(reader) 将 transient 迭代器转换为永久行列表:

with open('input.csv',newline='',encoding='utf-8') as f:
    reader = csv.reader(f)
    header = next(reader)
    rows = list(reader)

这会将第一行保存到它自己的变量 header 中。其余行将添加到命名行列表中。如果行是字符串列表,则变量 rows 是字符串列表的列表。

如果您想省略标题,请单独调用 next(reader) (无需左侧赋值)。读者将尽职尽责地返回 header ,但它只会进入空白。

现在您可以对这些行执行某些操作:

for row in rows:
    name = row[0]
    # do something with name...
    name = name.lower()
    # before saving it back to the list
    row[0] = name

最后,将修改后的行写回 CSV。对我来说,我总是会创建一个新文件:

  1. 我不会销毁原始数据(取回原始数据时的真正痛苦可能意味着要执行许多步骤,好心地请求某人再次发送它,甚至无法提供)。
  2. 我可以将我的手头工作与原始工作进行比较,以确保我做了正确的事情。
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(header)
    writer.writerows(rows)

一旦您对output.csv感到满意,您就可以决定如何处理input.csv - 保留它,将其丢弃,用output.csv覆盖它(os.rename('output.csv', 'input.csv'))。

祝你好运。 :)

关于python - .readlines() 返回空列表(已解决)-> 使用 csv 将数据添加到特定的命名行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76770009/

相关文章:

python - 二维数组的索引越界?

python Pandas : 'numpy.ndarray' object has no attribute 'apply'

python - 在python中获取列表的旋转

Java 从具有多个条件的列表中搜索子列表

php - 显示结果然后提供导出到 .csv 的选项?

java - 从 .csv 中排除 header

python - 如何使用 Pandas/Python 删除括号和所有数据?

python - 为什么我的参数/对象显示为 NoneType 对象?

list - SWI-Prolog : How to stop the predicate when the list is empty?(包括谓词)

powershell - 文件名到CSV