如何使用list.remove或del从CSV中删除行,并使用切片进行迭代?

2024-06-03 01:31:58 发布

您现在位置:Python中文网/ 问答频道 /正文

大家好,我该如何使用list.remove或del来删除我用来遍历列表的切片?我尝试了多种组合,但不断出现错误,要么是因为迭代不是列表,要么是因为我必须提供一个整数

import csv
import sys
from itertools import islice

sourcef = sys.argv[1]  
destf = sys.argv[2]  
linestart = int(sys.argv[3])   
lineend = int(sys.argv[4])  

with open (sourcef, 'rb') as file1, open (destf, 'wb') as file2:
    reader = csv.reader(file1)
    writer = csv.writer(file2)
    row = list(reader)
    for i in [slice(reader, linestart, lineend)]:
    #for i in islice(reader, linestart, lineend): 
        row.remove(i)
        print row

Tags: csvimport列表sysremovelistreaderint
2条回答

无法修改列表,因为您正在对其进行迭代。那就是疯狂。在迭代行时打印行,然后删除末尾的行

rows = list(reader)
for row in rows[linestart:lineend]:
    print row
rows[linestart:lineend] = []

这与csv没有什么关系。任何list都可以使用切片分配修改以删除相邻元素

>>> row = [1,2,3,4,5,6]
>>> row[slice(2,4)] = []
>>> row
[1, 2, 5, 6]

注意,我使用了slice,但是在这种情况下

>>> row[2:4] = []

是一样的。slice对象的主要兴趣在于可以将其作为参数传递/像变量一样使用

就你而言

row[linestart:lineend] = []

成功了吗

在您的情况下,如果csv文件非常大,则完全加载它可能是一个问题。您可以使用enumerate筛选出行:

reader = csv.reader(file1)
writer = csv.writer(file2)
for i,row in enumerate(reader):
    if linestart <= i < lineend:
       continue  # skip this range
    writer.writerow(row)

相关问题 更多 >