将复杂的txt文件(包括数组)读取到Python

问题描述 投票:0回答:1

我有一个txt文件,其中一列包含数组-每行具有与该列的值不同的大小的数组(该数组内部包含字符串,用逗号分隔并用引号定义)。这是一个示例:

   Color  Count People
0   Red   2     ["Ben", "Mike"]
1  Blue   0     []
2  Yellow 3     ["Ben", "Mike", "Tom"]

我想以Pandas作为数据框处理此文件。我已经尝试过多种方法,包括正则表达式来读取文件,但没有成功。

我想我可能必须逐行阅读并迭代创建表格,但是我不确定如何。

将不胜感激建议

python regex parsing text-files
1个回答
0
投票

您的样本看起来很像熊猫数据框的显示。将这样的框架保存到csv会有一些相同的问题,尽管可能更简单。我最近对一个类似的案例做出了回应,不同之处在于列表被numpy数组取代。

无论如何,让我们尝试简单的娱乐。

定义字典:

In [77]: {'Color':'Red', 'Count':2, 'People':['Ben','Mike']}                                              
Out[77]: {'Color': 'Red', 'Count': 2, 'People': ['Ben', 'Mike']}
In [78]: pd.DataFrame([_])                                                                                
Out[78]: 
  Color  Count       People
0   Red      2  [Ben, Mike]

或具有3行:

In [79]: pd.DataFrame([_77,_77,_77])                                                                      
Out[79]: 
  Color  Count       People
0   Red      2  [Ben, Mike]
1   Red      2  [Ben, Mike]
2   Red      2  [Ben, Mike]

如果我们将其写入csv:

In [80]: df = pd.DataFrame([_77,_77,_77])                                                                 
In [81]: df.to_csv('stack59675154.txt')                                                                   
In [82]: cat stack59675154.txt                                                                            
,Color,Count,People
0,Red,2,"['Ben', 'Mike']"
1,Red,2,"['Ben', 'Mike']"
2,Red,2,"['Ben', 'Mike']"

这类似于您的csv,除了使用逗号分隔符,并引用列表。它实际上是在保存列表的打印字符串str(['Ben', 'Mike'])

熊猫可以阅读:

In [83]: data = pd.read_csv('stack59675154.txt')                                                          
In [84]: data                                                                                             
Out[84]: 
   Unnamed: 0 Color  Count           People
0           0   Red      2  ['Ben', 'Mike']
1           1   Red      2  ['Ben', 'Mike']
2           2   Red      2  ['Ben', 'Mike']
In [85]: data['People'][0]                                                                                
Out[85]: "['Ben', 'Mike']"

但是People列实际上包含字符串,而不是列表。幸运的是字符串可以是eval

In [86]: eval(_)                                                                                          
Out[86]: ['Ben', 'Mike']

有一个更安全的字符串评估器,但我不会讲这个。

0,Red,2,"['Ben', 'Mike']"如果不带引号,读者会遇到问题,因为它将在方括号内看到定界符。简单的numpy.genfromtxt阅读器甚至可以处理这些引号。简单的读者只需使用line_list = line.split(delimiter),即可获得一个字符串列表,每个“列”一个。

我相信csv模块中的读者可以被指示处理嵌套引号,甚至嵌套括号。

© www.soinside.com 2019 - 2024. All rights reserved.