Python 使用特定条件连接列表中的项目

Python 使用特定条件连接列表中的项目,python,string,list,loops,Python,String,List,Loops,我目前正在处理一个csv文件中的100000多行,其结构如下: //f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11 1,false,false,0,"0","0","0","<color=asdf>d1, d2, d3<br>d4"d5", d6.</color>, 0, 1, false" 2,true,false,0,"0","0","0","<color=qwer>d1, "d2, d3"<br

我目前正在处理一个csv文件中的100000多行,其结构如下:

//f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11
1,false,false,0,"0","0","0","<color=asdf>d1, d2, d3<br>d4"d5", d6.</color>, 0, 1, false"
2,true,false,0,"0","0","0","<color=qwer>d1, "d2, d3"<br> d3<br>d4"d5" d6.</color>, 0, 1, false"
...
//f1、f2、f3、f4、f5、f6、f7、f8、f9、f10、f11
1,假,假,0,“0”,“0”,“d1,d2,d3
d4“d5”,d6.,0,1,假” 2,正确,错误,0,“0”,“0”,“d1”,“d2,d3”
d3
d4“d5”d6.,0,1,错误” ...
顶行具有文件的结构

我一直在尝试循环每行代码,为每一个值(f1、f2…)分配相应的值,并使用生成器修改文本,但我面临着正确拆分代码的问题。

如果我只是使用
line.split(',')
拆分行,我将有:

['1','false','false','0','0','0','0','d1','d2','d3
d4“d5','d6',0,1,false'
,列表长度为14

当我想要的时候:

['1',false',false','0','0','0','0','d1,d2,d3
d4“d5”,d6.,0,1,false”
列表长度为11,这样列表的长度对应于描述行
f1,f2…f11

在我看来,引号(“”中的逗号通过拆分所有内容导致
.split(“,”)
方法出现此问题

我一直在试图找到一种方法,将“正确”的项目合并在一起,但没有效果。有人能帮我解决这个问题吗?

对于这个答案,我将假设颜色标签对应于f8列,下面的整数和布尔值分别对应于f9、f10和f11列。这与p不匹配在布尔列末尾添加引号,但这是我能想到的最明显的方法,以确保示例行的长度分别为14列和11列。如果这不是csv文件的预期结构,请澄清,我很乐意相应地编辑答案

您可以使用标准库模块中的解析器来解析文件,而不是自己组合字符串。例如,名为
datafile.csv
的文件可以显示为:

导入csv
打开(“datafile.csv”和“r”)作为csvfile:
csvreader=csv.reader(csvfile)
对于csvreader中的行:
打印(行)
也就是说,在您提供的行上进行测试会

['1', 'false', 'false', '0', '0', '0', '0', '<color=asdf>d1, d2, d3<br>d4d5"', ' d6.</color>', ' 0', ' 1', ' false"']
['2', 'true', 'false', '0', '0', '0', '0', '<color=qwer>d1, d2', ' d3"<br> d3<br>d4"d5" d6.</color>', ' 0', ' 1', ' false"']
result
将包含一个
Match
对象,该对象将具有与括号包围的位置相对应的“捕获组”。我们可以通过调用方法
Match.group
从对象中提取这些捕获组,并将组的位置作为参数。第一组和第三组可以安全地拆分逗号,因为我们已经观察到它们只包含简单数据,内部没有逗号,并且包含颜色标签的第二组不需要拆分,因为它包含一列。因此,我们使用

result.group(1).split(',')+[result.group(2)]+result.group(3).split(','))
如果引号的位置与提供的数据相同,但您希望将其更改为接近颜色标记,则可以通过从第三个捕获组的末尾删除引号并将其添加到第二个捕获组来完成。因此,上面的表达式变为

result.group(1).split(',')+[result.group(2)+'“]+result.group(3)[:-1]。split(','))
其中,
[:-1]
用于切掉最后一个字符。将初始正则表达式匹配语句与上面的表达式相结合,并使用它们替换
行。拆分(',')
应产生所需的结果。使用此方法,显示csv文件的所有行的工作方式如下:

重新导入
将open(“testing.csv”,“r”)作为csvfile:
对于csvfile.readlines()中的行:
打印(行)
结果=重新匹配(r“(*)(\"\ 对于这个答案,我将假设颜色标签对应于f8列,下面的整数和布尔值分别对应于f9、f10和f11列。这与布尔值列末尾引号的位置不匹配,但这是我能想到的确保example行的长度分别为14列和11列。如果这不是csv文件的预期结构,请澄清,我很乐意相应地编辑答案

您可以使用标准库模块中的解析器来解析文件,而不是自己组合字符串。例如,名为
datafile.csv
的文件可以显示为:

导入csv
打开(“datafile.csv”和“r”)作为csvfile:
csvreader=csv.reader(csvfile)
对于csvreader中的行:
打印(行)
也就是说,在您提供的行上进行测试会

['1', 'false', 'false', '0', '0', '0', '0', '<color=asdf>d1, d2, d3<br>d4d5"', ' d6.</color>', ' 0', ' 1', ' false"']
['2', 'true', 'false', '0', '0', '0', '0', '<color=qwer>d1, d2', ' d3"<br> d3<br>d4"d5" d6.</color>', ' 0', ' 1', ' false"']
result
将包含一个
Match
对象,该对象将具有与括号包围的位置相对应的“捕获组”。我们可以通过调用方法
Match.group
从对象中提取这些捕获组,并将组的位置作为参数。第一组和第三组可以安全地拆分逗号,因为我们已经观察到它们只包含简单数据,内部没有逗号,并且包含颜色标签的第二组不需要拆分,因为它包含一列。因此,我们使用

result.group(1).split(',')+[result.group(2)]+result.group(3).split(','))
如果引号的位置与提供的数据相同,但您希望将其更改为接近颜色标记,则可以通过从第三个捕获组的末尾删除引号并将其添加到第二个捕获组来完成。因此,上面的表达式变为

result.group(1).split(',')+[result.group(2)+'“]+result.group(3)[:-1]。split(','))
其中,
[:-1]
用于切掉最后一个字符