【问题标题】:Deleting row from CSV using python使用python从CSV中删除行
【发布时间】:2013-08-17 05:52:07
【问题描述】:

我有一个包含网页链接的 csv 文件。我正在从每个链接收集数据并将其保存在单独的 csv 文件中。
现在,如果我必须从我离开的地方恢复文件,我必须手动从 csv 文件中删除条目,然后运行代码。
我浏览了 csv 模块的文档,但找不到任何用于此目的的函数。
我还浏览了 Stackoverflow 和其他网站上有关此问题的所有其他问题,但没有任何帮助。
有没有办法按照我想要的方式删除行?

这是我现在拥有的

import pandas as p

df = p.read_csv("All_Links.csv")

for i in df.index:
    try:
        url= df.ix[i]['MatchLink']

        #code process the data in the link

        #made sure that processing has finished
        #Now need to delete that row

【问题讨论】:

  • 从文件中间删除内容的过程只能通过读取文件并写入除要跳过的行之外的所有内容来完成。您可以读取 CSV 的所有行,然后拼接数组,然后将数组写回文件,但这只是完成相同的事情,但内存要求更高
  • 有没有考虑使用df.drop(i, 1),看api doc:pandas.pydata.org/pandas-docs/stable/generated/…

标签: python csv python-2.7 pandas


【解决方案1】:

如果您想将未处理的其余数据写回 csv 文件,即仅删除已处理的数据,您只需将算法修改为:

import pandas as p

df = p.read_csv("All_Links.csv")

for i in df.index:
    try:
        url= df.ix[i]['MatchLink']
        #code process the data in the link
        #made sure that processing has finished
        df.iloc[i:].to_csv('All_links.csv', index=False)

但这会在每次迭代时写入您的文件,也许最好记住 i 的值并在完成所有迭代后执行:

import pandas as p

df = p.read_csv("All_Links.csv")

i = 0
for i in df.index:
    try:
        url= df.ix[i]['MatchLink']
        #code process the data in the link
        #made sure that processing has finished
    except:
        # something broke, this row isn't processed decrease i
        i -= 1
        break

# Now write the rest of unprocessed lines to a csv file
df.iloc[i:].to_csv('All_links.csv', index=False)

【讨论】:

    【解决方案2】:

    由于您已经将整个文件读入数据帧,您可以从您离开的点开始迭代。假设你离开了i=23,你可以这样做:

    import pandas as p
    
    df = p.read_csv("All_Links.csv")
    
    last_line_number = 23
    for i in df.index[last_line_number:]:
        try:
            url= df.ix[i]['MatchLink']
            #code process the data in the link
            #made sure that processing has finished
            #Now need to delete that row
    

    这是最简单的方法。更健壮的方法是有 2 个文件,一个用于要处理的行,一个用于已处理的行。

    【讨论】:

    • 感谢您的回答,是的,这是一种方法。但我会等待是否有人可以回答原始问题,即。 “我如何删除行”,这对我的应用程序来说是最好的
    • 不幸的是,对于文本文件,唯一的方法是每次写入一个新文件或用您想要的文件覆盖现有文件。这是昂贵的。没有办法只删除一行。
    • :-/ 是的,你是对的,大约有 100,000 行,并且处理发生在一个循环中,任何与循环内的文件处理相关的东西都使它变得非常昂贵。因此我认为@viktor 的方法是我能做的最好的。
    • 是的,这是一个实用的解决方案,它应该足够高效并且比我的更完整。
    猜你喜欢
    • 1970-01-01
    • 2019-11-17
    • 2018-11-30
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2020-05-11
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多