取消转义 html 字符引用:
import html
with open('data.csv', 'r', encoding='cp1251') as f, open('data-fixed.csv', 'w') as g:
content = html.unescape(f.read())
g.write(content)
print(content)
# thing;weight;price;colour
# apple;1;2;red
# m & m's;0;10;several
# cherry;0,5;2;dark red
然后以通常的方式加载 csv:
import pandas as pd
df = pd.read_csv('data-fixed.csv', sep=';')
print(df)
yields
thing weight price colour
0 apple 1 2 red
1 m & m's 0 10 several
2 cherry 0,5 2 dark red
尽管数据文件“相当大”,但您似乎有足够的内存将其读入 DataFrame 中。因此,您还应该有足够的内存来将文件读入单个字符串:f.read()
。通过一次调用即可转换 HTMLhtml.unescape
比调用更高效html.unescape
在许多较小的弦上。这就是为什么我建议使用
with open('data.csv', 'r', encoding='cp1251') as f, open('data-fixed.csv', 'w') as g:
content = html.unescape(f.read())
g.write(content)
而不是类似的东西
with open('data.csv', 'r', encoding='cp1251') as f, open('data-fixed.csv', 'w') as g:
for line in f:
g.write(html.unescape(line))
如果您需要多次读取此数据文件,那么修复它(并将其保存)是值得的
到磁盘),这样你就不需要调用html.unescape
每次你想解析的时候
数据。这就是为什么我建议将未转义的内容写入data-fixed.csv
.
如果读取此数据是一项一次性任务,并且您希望避免写入磁盘的性能或资源成本,那么您可以使用 StringIO(内存中的文件类对象):
from io import StringIO
import html
import pandas as pd
with open('data.csv', 'r', encoding='cp1251') as f:
content = html.unescape(f.read())
df = pd.read_csv(StringIO(content), sep=';')
print(df)