如何使用 Pandas 读取 CSV,并且只将其读入 1 列而没有 Sep 或 Delimiter
How to read a CSV with Pandas and only read it into 1 column without a Sep or Delimiter
我有一个由许多电子邮件密码组合组成的 txt 文件,问题是它在开始中间或结尾充满了符号。这些都可以使用正则表达式替换,但我的问题是读取 txt 文件并将所有数据保留在 1 列中。不能使用 Delimiter 或 Sep,因为每行包含太多不同的符号。即使是默认的“,”也不可行,因为行以“,”开头,所以它不会保留任何数据。
我已经有了一个脚本,它只能找到电子邮件并使用 pandas 和正则表达式消除噪音,但最初的阅读是我的问题。我听说过在 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
,则创建一个新列并连接第 1 列和第 2 列,但这不提供可行的解决方案。
所以你的文件只包含一栏的信息,还是只有密码还有其他信息?
你的文件有多大?
如果不是很大,你可以这样做:
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')
所以你要确保这些行不会被拆分(假设你的行是由换行符分隔的。这样你甚至可以使用自定义转换器来解析电子邮件地址(如果你真的只需要的信息一栏),这可能会节省一些 space.
答案:
found_reader = pd.read_csv(breach_file, names=['Email'], dtype={'Email':str}, delimiter='\n', quoting=csv.QUOTE_NONE, engine='c')
定界符或 Sep 都可以。
我有一个由许多电子邮件密码组合组成的 txt 文件,问题是它在开始中间或结尾充满了符号。这些都可以使用正则表达式替换,但我的问题是读取 txt 文件并将所有数据保留在 1 列中。不能使用 Delimiter 或 Sep,因为每行包含太多不同的符号。即使是默认的“,”也不可行,因为行以“,”开头,所以它不会保留任何数据。
我已经有了一个脚本,它只能找到电子邮件并使用 pandas 和正则表达式消除噪音,但最初的阅读是我的问题。我听说过在 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
,则创建一个新列并连接第 1 列和第 2 列,但这不提供可行的解决方案。
所以你的文件只包含一栏的信息,还是只有密码还有其他信息? 你的文件有多大?
如果不是很大,你可以这样做:
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')
所以你要确保这些行不会被拆分(假设你的行是由换行符分隔的。这样你甚至可以使用自定义转换器来解析电子邮件地址(如果你真的只需要的信息一栏),这可能会节省一些 space.
答案:
found_reader = pd.read_csv(breach_file, names=['Email'], dtype={'Email':str}, delimiter='\n', quoting=csv.QUOTE_NONE, engine='c')
定界符或 Sep 都可以。