我有一个带有以下示例行的文件:
(22642441022L, u'<a href="http://example.com">Click</a>', u'fox, dog, cat are examples http://example.com')
(1153634043, u'<a href="http://example.com">Click</a>', u"I learned so much from my mistakes, I think I'm gonna make some more")
我尝试使用以下代码将其解析为对象列表:
import csv
file_path = 'Data/example.txt'
data = []
with open(file_path, 'r') as f:
reader = csv.reader(f, skipinitialspace=True)
for row in reader:
data.append({'id' : row[0], 'source' : row[1], 'content' : row[2]})
正如预期的那样,内容因“&#39;”而被截断。在内容列中。 是否有任何软件包可以帮助我解决这个问题?
答案 0 :(得分:2)
查看您的数据,有人使用python2将列表的str
版本原样转储到文件中。
有一件事是肯定的 - 您无法使用CSV阅读器获取此数据。你甚至不能使用JSON解析器(这将是下一个最好的东西)。
您可以做的是使用ast.literal_eval
。使用python2,这开箱即用。
import ast
data = []
with open('file.txt') as f:
for line in f:
try:
data.append(ast.literal_eval(line))
except (SyntaxError, ValueError):
pass
data
看起来应该是这样的 -
[(22642441022L,
'<a href="http://example.com">Click</a>',
'fox, dog, cat are examples http://example.com'),
(1153634043,
'<a href="http://example.com">Click</a>',
"I learned so much from my mistakes, I think I'm gonna make some more")]
然后,您可以将data
传递给DataFrame
原样 -
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
df
A B \
0 22642441022 <a href="http://example.com">Click</a>
1 1153634043 <a href="http://example.com">Click</a>
C
0 fox, dog, cat are examples http://example.com
1 I learned so much from my mistakes, I think I'...
如果你想让它与python3一起工作,你需要摆脱长后缀L
和unicode前缀u
。您可以使用re.sub
模块中的re
执行此操作。
import re
for line in f:
try:
i = re.sub('(\d+)L', r'\1', line) # remove L suffix
j = re.sub('(?<=,\s)u(?=\')', '', i) # remove u prefix
data.append(ast.literal_eval(j))
except (SyntaxError, ValueError):
pass
注意添加的re.sub('(\d+)L', r'\1', line)
,它删除了一串数字末尾的L
后缀。
答案 1 :(得分:1)
所以看起来文件生成的是这样的(纯粹的Python转储str()
或print
):
data_list = [
(22642441022L, u'<a href="http://example.com">Click</a>', u'fox, dog, cat are examples http://example.com'),
(1153634043, u'<a href="http://example.com">Click</a>', u"I learned so much from my mistakes, I think I'm gonna make some more")
] # List of tuples
with open('./stack_084.txt', 'w') as f:
f.write('\n'.join([str(data) for data in data_list]))
我们会想到正则表达式(假设您的第二个“列”上的值始终以<a
开头,并以a>
结尾:
import pprint
import re
line_re = re.compile(
r'\('
r'(?P<num>\d+)L{0,1}.'
r'+?'
r'[\'\"](?P<source>\<a.+?a\>)[\"\']'
r'.+?'
r'[\'\"](?P<content>.+?)[\"\']'
r'\)'
)
data = []
with open('./stack_084.txt', 'r') as f:
for line in f:
match = line_re.match(line)
if match:
data.append({
'id': int(match.groupdict()['num']),
'source': match.groupdict()['source'],
'content': match.groupdict()['content']
})
# You should see parsed data here:
print(pprint.pformat(data))
输出:
[{'content': 'fox, dog, cat are examples http://example.com',
'id': 22642441022,
'source': '<a href="http://example.com">Click</a>'},
{'content': "I learned so much from my mistakes, I think I'm gonna make some "
'more',
'id': 1153634043,
'source': '<a href="http://example.com">Click</a>'}]