如何使用熊猫读取CSV并仅将其读入1列而没有Sep或Delimiter

时间:2019-06-07 09:22:24

标签: python regex python-3.x pandas read.csv

我有一个由许多电子邮件密码组合组成的txt文件,问题是开头或结尾处充满了符号。这些都可以使用正则表达式替换,但是我的问题是读取txt文件并将所有数据保留在1列中。分隔符或Sep不能使用,因为每行包含许多不同的符号。即使默认的','也不可行,因为行以','开头,因此它不会保留任何数据。

我已经有了一个脚本,该脚本只能查找电子邮件并使用pandas和regex消除噪音,但是最初的阅读是我的问题。我听说过在c引擎上使用python引擎,但是这样做会使某些列显示NaN并将其余的电子邮件传递组合分别放在第2列中。

with open(self.breach_file, 'r', encoding='utf-8') as breach_file:
            found_reader = pd.read_csv(breach_file, names=['Email'], dtype={'Email':str}, quoting=csv.QUOTE_NONE, engine='c')
            found_reader = pd.DataFrame(found_reader)
            found_reader['Email'] = found_reader['Email'].replace(symbol_dictionary_colon, ':', regex=True).replace(symbol_dictionary_no_space, '', regex=True)
            found_reader = found_reader.str.replace('?', '', regex=True).str.strip()
            loaded_list = found_reader.str.replace(symbol_dictionary_first_char, '', regex=True)
        breach_file.close()

我只希望无论行以什么符号开头,都可以在1列中读取数据。有帮助吗?

P.S。我尝试使用2列,然后如果第1列是NaN,则创建一个新的具有col 1和2连接的列,但这不能提供可行的解决方案。

2 个答案:

答案 0 :(得分:1)

因此,您的文件仅包含一列的信息,还是仅包含密码的其他信息? 您的文件有多大?

如果不大,可以执行以下操作:

with open(self.breach_file, 'r', encoding='utf-8') as breach_file:
    passwords= breach_file.readlines()

pd.DataFrame({'passwords': passwords})

如果它更大,则可以逐行读取并将每一行同时添加到数据框中(但这可能很慢)。您也可以尝试使用read_fwf函数,该函数需要固定宽度的文件,因此不查找字段分隔符。显然,它不需要文件包含相同长度的行。看起来像:

pd.read_fwf('fake_fixed.txt', widths= [100])

您只需确保使用的宽度与最长的密码一样长。

另一种可能性是使用

pd.read_csv('fake_fixed.txt', sep='\n')

因此,请确保行不被分割(假设行之间用换行符分隔。这样,您甚至可以使用自定义转换器来解析电子邮件地址(以防万一,您实际上只需要一列的信息) ),这样可以节省一些空间。

答案 1 :(得分:0)

答案:

found_reader = pd.read_csv(breach_file, names=['Email'], dtype={'Email':str}, delimiter='\n', quoting=csv.QUOTE_NONE, engine='c')

定界符或Sep均有效。

信用:https://stackoverflow.com/users/6925185/jottbe