【问题标题】:python: how to delete row and modify specific list string from CSVpython:如何从 CSV 中删除行和修改特定的列表字符串
【发布时间】:2015-10-11 12:22:24
【问题描述】:

这是我第一次发布问题,如果我犯了任何错误,请提前道歉。

我目前正在尝试创建一个自定义 python 程序(几乎是一个解析器),它可以接收这样的数据:

junk
junk
junk
junk
junk
junk
fields       title   title   title
data_type   d_type  d_type  d_type
data1   data2    data 3
data4   data 5   data6
data7   data8    data9
junk

我想要的输出在哪里:

title   title   title
data1   data2   data3
data4   data5   data6
data7   data8   data9

这是迄今为止我的代码的工作部分:

import csv
import itertools
with open('file.log','rb') as csvfile:
    rowlist = csv.reader(csvfile, delimiter = '\t')
    for row in itertools.islice(rowlist,6,12):   
    print row

每当运行上述代码时,它都会生成一系列列表,如下所示

['fields','title1', 'title2', 'title3']
['data_type','d_type','d_type', 'd_type']
['data1', 'data2', 'data3']
['data4', 'data5', 'data6']
['data7', 'data8', 'data9']

列表中的第一个数据条目(data1、data4、data7)始终是一个数字,而其他数据条目可以是任何字符串/数字/字符。

itertools已经解决了切断文件的顶部和底部,但我仍然在努力

  • 删除“data_type 行”
  • 删除“字段”,即: ['fields','title1', 'title2', 'title3']----->['title1', 'title2', 'title3']

我已经看到了一些删除行/覆盖行的解决方案,但是,我没有太多可用的内存,因此我必须将打开/关闭/写入保持在最低限度。非常感谢任何和所有帮助。

【问题讨论】:

  • 我们不知道是什么决定了应该包含还是排除一行。
  • 那么为什么不直接使用if row[0] == 'fields': row = row[1:]if row[0] == 'data_type': continue
  • 您可以使用itertools.ifilterfalse docs.python.org/2/library/itertools.html#itertools.ifilterfalse 进一步过滤您的迭代。
  • 一个示例 csv 文件可能有助于更好地理解问题。您可以删除“for”循环中的 data_type 行,对吗?从 for 循环中的列表中删除项目以及使用 : if 'fields' in mylist: mylist.remove('fields')

标签: python parsing csv


【解决方案1】:

只需对每一行进行切片:

  for row in islice(rowlist, 6, 12):
    if row[0] == "data_type":
        continue
    elif row[0] == "fields":
          print(row[1:])
    else:
        print(row)

如果您只是写行,请再次使用 islice:

for row in islice(rowlist, 6, 12):
    if row[0] == "data_type":
        continue
    elif row[0] == "fields":
         fileobj.write(islice(rowlist, 1,None))
    else:
        fileobj.write(row)

如果您实际上是在尝试覆盖原始文件,您可以将这些行写入tempfile 并将原始文件替换为shutil.move

from shutil import move
from tempfile import NamedTemporaryFile

with open('file.csv', 'rb') as csvfile, NamedTemporaryFile(dir=".", delete=False) as temp:
    rowlist = csv.reader(csvfile)
    for row in islice(rowlist, 6, 12):
        if row[0] == "data_type":
            continue
        elif row[0] == "fields":
            temp.write(islice(rowlist, 1, None))
        else:
            temp.write(row)

move(temp.name,"file.csv")

【讨论】:

  • 只有其中一行需要删除第一列。
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 2019-10-09
  • 2022-10-13
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多