【问题标题】:How to insert character in csv cell in python?如何在python的csv单元格中插入字符?
【发布时间】:2017-08-03 06:06:38
【问题描述】:

我是 python 新手。这是我的 csv 文件:

data;data;name surname; data; data
data;data;name surname; data; data
data;data;name surname; data; data
data;data;name surname; data; data

我想做的是插入“;”像这样制作姓名和姓氏2列:

data;data;name;surname; data; data
data;data;name;surname; data; data
data;data;name;surname; data; data
data;data;name;surname; data; data

但困难的是有时会有不止一个空格,就像这样:

data;data;name surname surname2; data
data;data;name surname surname2 surname3; data 

我只是想替换第一个空格,而不是全部这样:

data;data;name;surname surname2; data
data;data;name;surname surname2 surname3; data 

这是我的代码,但它替换了每个空格:

def modify_rows():
    with open("result2.csv","rb") as source:
          rdr= csv.reader(source, delimiter=';')
          with open("result3.csv","wb") as result:
             wtr= csv.writer(result,delimiter=';')
                 for r in rdr:
                    rowname = r[3].replace(' ', ';')
                   wtr.writerow((r[0],r[1],rowname,r[2]))    

希望我能找到帮助。

【问题讨论】:

  • 你能给出一些列和行中预期文件大小的方向吗?如果我们谈论的是大文件,答案可能会有所不同
  • 试试repython库模块
  • 我不同意,找到第一个空格比正则表达式容易得多。

标签: python csv


【解决方案1】:

您可以通过传递maxsplit 参数告诉Python 的split() 在给定数量的匹配后停止。因此,在您的情况下,您只需要在第一个空格之后拆分如下:

import csv

with open('input.csv', 'rb') as f_input, open('output.csv', 'wb') as f_output:
    csv_output = csv.writer(f_output, delimiter=';')

    for row in csv.reader(f_input, delimiter=';'):
        # Skip empty lines
        if len(row) > 3:
            try:
                name, surname = row[2].split(' ', 1)
            except ValueError as e:
                # No surname
                name, surname = row[2], ''

            row[2] = name
            row.insert(3, surname)
            csv_output.writerow(row)

所以对于输入:

data;data;name surname1 surname2;data;data
data;data;name surname;data;data
data;data;name surname;data;data
data;data;name surname;data;data

你会得到:

data;data;name;surname1 surname2;data;data
data;data;name;surname;data;data
data;data;name;surname;data;data
data;data;name;surname;data;data

【讨论】:

  • 很好的答案,如果文件需要相同,我认为您应该包含一个两步版本,首先读入一个列表,然后写入同一个文件,包括关于使用后果的 cmets这种处理大文件的方法(内存问题)
  • 谢谢大家的帮助。我不知道 split() 。我像你的例子一样使用它,但我收到错误“ValueError: need more than 1 value to unpack”,不知道出了什么问题
  • 您在 csv 文件中有一个空行,或者您有一行只有 name 但没有 surname
  • 没错,你是对的。如何为 name 但没有姓氏添加这种例外?
  • 完美运行,非常感谢。我猜我还有进步。
【解决方案2】:
>>> name_surname_regex = re.compile('^([^;]*;[^;]*;)([^\s]*\s[^\s]*)(.*)$')
>>> match_obj = name_surname_regex.match(data[1])
>>> for list_d in data:
        match_obj = name_surname_regex.match(list_d)
        print match_obj.group(1) + match_obj.group(2).replace(' ', ';') + match_obj.group(3)

相信我,如果数据与您提供的不符,您的代码肯定会出现很多错误

【讨论】:

  • 过于复杂,只是部分回答
猜你喜欢
  • 1970-01-01
  • 2022-01-24
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多