使用转义字符读取csv

时间:2019-05-27 09:26:02

标签: python pandas csv

我有一个csv文件,其中包含一些文本。我想将此文本标记化(分解为单词列表),并且在pd.read_csv如何解释转义字符方面遇到问题。

我的csv文件如下:

text, number
one line\nother line, 12

,代码如下:

df = pd.read_csv('test.csv')
word_tokenize(df.iloc[0,0])

输出为:

['one', 'line\\nother', 'line']

我想要的是:

['one', 'line', 'other', 'line']

问题是pd.read_csv()不会将\n解释为换行符,而是解释为两个字符(\n)。

我尝试将escapechar参数设置为'\''\\',但是两者都只是从字符串中删除斜杠而不对换行符做任何解释,即字符串变成on one linenon other line

如果我显式设置df.iloc[0,0] = 'one line\nother line',则word_tokenize可以正常工作,因为这次\n实际上被解释为换行符。

理想情况下,我只需要更改pd.read_csv()解释文件的方式即可,但是其他解决方案也可以。

3 个答案:

答案 0 :(得分:0)

在这种情况下,只需使用:

data = pd.read_csv('test.csv', sep='\\,', names=['c1', 'c2', 'c3', 'c4'], engine='python')

答案 1 :(得分:0)

这个问题措辞有点差。我猜想pandas在字符串中转义\会使nltk.word_tokenize感到困惑。 pandas.read_csv只能使用一个分隔符(或正则表达式,但我怀疑您想要这样做),因此它将始终将文本列读取为"one line\nother line",并转义反斜杠以保留它。如果要进一步解析和格式化它,可以使用转换器。这是一个示例:

import pandas as pd
import re

df = pd.read_csv(
         "file.csv", converters={"text":lambda s: re.split("\\\\n| ", s)}
)

以上结果为:

                       text   number
0  [one, line, other, line]       12

编辑::如果需要使用nltk进行拆分(例如,拆分取决于语言模型),则需要先对字符串进行转义,然后再传递给{ {1}};尝试这样的事情:

word_tokenize

注意:查询中的匹配列表非常棘手,因此您可能希望通过像这样更改lambda将它们转换为元组:

lambda s: word_tokenize(s.encode('utf-8').decode('unicode_escape')

答案 2 :(得分:0)

您可以简单地尝试一下

import pandas as pd

df = pd.read_csv("test.csv", header=None)
df = df.apply(lambda x: x.str.replace('\\', " "))
print(df.iloc[1, 0])

# output: one line other line