在编写了一个函数来生成一些数据之后,我想添加保存数据的功能.我最初使用以下代码开始,并使用‘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...
[]

真的不确定为什么它看不懂台词?我以为我以前使用过相同的代码来读取这个文件的行,所以我真的很困惑为什么它现在不能工作.

我try 向代码中添加诸如f.seek(0)之类的内容,但这并没有什么不同.我还try 将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的人试图使用filemode append,因此他们通常会给自己带来一些麻烦.

通常,我建议读取源CSV,修改行,然后将修改后的行写到另一个文件.一旦验证了新文件的有效性,就可以决定如何处理旧文件.

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

给定CSV:

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

使用csv.ader(Ome_File)函数为该文件创建一个row iterator:

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

局部变量读取器将生成完全解码的行.使用NEXT(读取器)可以一次返回一行:

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

Reader返回的row只是一个字符串列表.

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

for row in reader:
    print(row)

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

请注意,读者从停止的地方继续阅读Next()语句.此外,现在阅读器已经exhausted了-没有更多的行要解码.try 从中读取将引发StopIteration异常:

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

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

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

这会将第一行保存到它自己的变量Header.其余行将添加到列表命名行中.如果行是一个字符串列表,那么变量ROWS就是一个字符串列表列表.

如果您想省略标题,可以单独调用Next(Reader)(不带左侧赋值).阅读器会尽职尽责地返回标题,但它只会进入空白.

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

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. 我不会 destruct 原始数据(拿回原始数据时的真正痛苦可能意味着许多步骤,要求某人友好地重新发送它,或者甚至不可用).
  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相关问答推荐

合并其中一个具有重叠范围的两个框架的最佳方法是什么?

使用Curses for Python保存和恢复终端窗口内容

从单个列创建多个列并按pandas分组

在for循环中仅执行一次此操作

Python中的函数中是否有充分的理由接受float而不接受int?

Python中使用时区感知日期时间对象进行时间算术的Incredit

我必须将Sigmoid函数与r2值的两种类型的数据集(每种6个数据集)进行匹配,然后绘制匹配函数的求导.我会犯错

根据条件将新值添加到下面的行或下面新创建的行中

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

Godot:需要碰撞的对象的AdditionerBody2D或Area2D以及queue_free?

如何调整QscrollArea以正确显示内部正在变化的Qgridlayout?

如何从数据库上传数据到html?

如果满足某些条件,则用另一个数据帧列中的值填充空数据帧或数组

如何在Python中找到线性依赖mod 2

如何在turtle中不使用write()来绘制填充字母(例如OEG)

Django—cte给出:QuerySet对象没有属性with_cte''''

如何从列表框中 Select 而不出错?

Tkinter菜单自发添加额外项目

在Python中调用变量(特别是Tkinter)

如何使用两个关键函数来排序一个多索引框架?