Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中的csv单元格中插入字符?_Python_Csv - Fatal编程技术网

如何在python中的csv单元格中插入字符?

如何在python中的csv单元格中插入字符?,python,csv,Python,Csv,我是python新手。这是我的csv文件: 数据数据姓名;数据数据 数据数据姓名;数据数据 数据数据姓名;数据数据 数据数据姓名;数据数据 我想做的事情是插入;要使“姓名”和“姓氏”两列如下所示: 数据数据名称姓数据数据 数据数据名称姓数据数据 数据数据名称姓数据数据 数据数据名称姓数据数据 但困难的是,有时不止一个空间,比如: data;data;name;surname surname2; data data;data;name;surname surname2 surname3; data

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

数据数据姓名;数据数据 数据数据姓名;数据数据 数据数据姓名;数据数据 数据数据姓名;数据数据 我想做的事情是插入;要使“姓名”和“姓氏”两列如下所示:

数据数据名称姓数据数据 数据数据名称姓数据数据 数据数据名称姓数据数据 数据数据名称姓数据数据 但困难的是,有时不止一个空间,比如:

data;data;name;surname surname2; data
data;data;name;surname surname2 surname3; data 
数据数据姓名姓氏2;数据 数据数据姓名姓氏2姓氏3;数据 我只想替换第一个空格,不是这样的:

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]))    
希望我能找到帮助

>>> 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)
相信我,如果数据不符合您所给出的,那么代码肯定会出现很多错误

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

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

例如,您能给出一些列和行中预期文件大小的方向吗?答案可能会有所不同,如果我们谈论的是python库的大文件try re模块,我不同意,找到第一个空格比正则表达式容易得多,首先读入一个列表,然后写入同一个文件,包括对使用这种方法处理大文件内存问题的后果的评论感谢大家的帮助。我不知道斯普利特。我像你的例子一样使用它,但我得到了错误值error:需要超过1个值才能解包,不知道是什么错你的csv文件中有一个空行,或者你有一行,其中只有一个名称,但没有姓氏。确切地说,你是对的。我怎样才能为名字而不是姓氏添加这种例外?非常好用,谢谢。我猜我还有进步。