【问题标题】:Is there any way to delete the 100th row (or 'last row'), from a csv file, as a new row gets added?当添加新行时,有什么方法可以从 csv 文件中删除第 100 行(或“最后一行”)?
【发布时间】:2021-03-22 11:17:02
【问题描述】:

有什么方法可以在添加新行时从 csv 文件中删除最后一行? (无需创建单独/重复的 csv 文件).

我的目标是防止正在运行的 csv 文件超过行数和大小。

理想情况下:

  1. 无需创建其他文件
  2. 首选 csv.DictWriter/Reader ,但 csv.reader 或 csv.writer 都可以。

我得到的错误是:
DictWriter 不可迭代。
而且 DictReader 不会写入 csv。

【问题讨论】:

  • 基本上你打开文件进行读写并创建一个“DictReader”和“DictWriter”来包装同一个打开的文件。然后你读到你想保留的最后一行,然后写下新的一行。最后,您应该“截断”文件以删除可能的旧数据。
  • 谢谢!我不知道您可以同时使用 DictReader 打开一个文件,然后还有 DictWriter(在 Reader 循环内) - 在网络上的任何地方都找不到这样的示例。唯一的选择是创建第二个文件 - 听起来效率低下....仍在阅读 truncate 的作用 - 如果我正确地执行您的第一个建议,似乎没有必要。
  • 如果旧行比新行长,旧行的最后一个字符将保留,因此“截断”。如果您确定新行永远不会更短,您可以省略它。

标签: python csv reader writer


【解决方案1】:
import csv, sys, os

filename = "sampletable2.csv"
'''
 sampletable2.csv  contains :
            high, low, precipitation
            22, 53, 0.12
            33, 52, 0.1
            44, 54, 0.1
            99, 98, 0.97 
'''
new_row = {'high': '99', 'low': '98', 'precipitation': '0.97'}
data = []  # list of dictionaries
max_rows = 4

# READER
with open(filename, 'r', newline='') as csvfile:
    csvreader = csv.DictReader(csvfile)
    for i, row in enumerate(csvreader):
        if i >= max_rows:  # =row to chop - 2
            del (data[:- max_rows])  # row to chop - 2  del(data[:max_rows])  # row to chop - 2
        else:
            data.append(row)  # continually add pre found rows to new data_dic list.
    data.append(new_row)  # ALWAYS ADD ((( NEW )) FOUND SINGLE DATA RECORD
    csvfile.close()
    
    # WRITER (write while still opened for reading) ; just writes new limited row data to csv
    with open(filename, 'w', newline='') as f:
        fieldnames = ["high", "low", "precipitation"]
        csvwriter = csv.DictWriter(f, fieldnames=fieldnames)
        csvwriter.writeheader()  # AWAYS WRITE HEADER due to 'w' starts all over ; never use 'a'
        csvwriter.writerows(data)
        
        f.close()  # not necess but allows to see updated csv if viewing sep monitor real-time

【讨论】:

  • 打开同一个已经打开的文件可能会产生错误或意外结果,具体取决于操作系统。这里也没有必要。
  • 到目前为止(成功),每秒循环 12 小时。注: 1) 保持固定数量的行。 2)据我所知,READER 和 WRITER 必须同时打开,相同的 csv 文件,但是具有不同的对象名称('as csvfile' 然后 'as newfile')。原因是 READER 必须用 'r' 打开,因为不可写。 WRITER 以“w”打开,以便能够在内存中创建新的字典,并将其保存为同一个文件。 3)必须同时打开,因为(仅)READER 是可迭代的,而 WRITER 是唯一可以写入文件的。 (仅在 Windows10 上测试过)
  • 在打开文件进行写入之前,您已经构建了一个包含要写入的行的列表“数据”,并且在写入时您不再迭代“csvreader”,而只使用“数据”列表。因此,您可以在打开文件进行写入之前关闭文件进行读取。但是,如果这真的如此有效并且仅供您自己使用,您可以保持原样。
  • 有道理谢谢迈克尔!
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多