我正在处理需要读取需要过滤的大型TXT文件的python 3.x项目(例如,删除多个空格,空行,以某些字符串开头的行等)和最后由REGEX匹配拆分。
我现在正在做的是使用pandas数据帧来存储每一行(这样可以使用pandas startswith()或endswith()轻松删除行。另一方面,通过让文本文件的每一行对应于DataFrame中的一行,我无法弄清楚如何在REGEX匹配之间提取数据。这是一个例子:
| 0 | REGEX MATCH |
| 1 | data |
| 2 | data |
| 3 | REGEX MATCH |
| 4 | data |
| 5 | REGEX MATCH |
所以问题是如何在匹配之间提取数据(在本例中,行0到2; 3到4和5)。这在大熊猫中甚至可能吗?
另一种选择是从文本文件中使用read()并进行DataFrame,过滤,拆分等常规字符串操作实例,我不确定它是否适用于大文本文件。在这种情况下,我在REGEX匹配之间有不需要的数据。例如:
str = "This is REGEX_MATCH while between another \n \n\ REGEX_MATCH there is some unwanted data"
在上面,我需要删除额外的空格,\ n,最后使用REGEX来分割匹配。唯一的问题是我的源文本文件非常大。
Pandas在删除/过滤方面很快,而常规字符串在分割时更容易。
有什么想法吗?
谢谢!
EDIT。这是我的源文本的样子。你可以看到它是一团糟(从PDF中提取)。每行都是pandas数据帧中的一行。问题是,是否可以提取包含一系列数字(包括那些行)的那些行之间的所有数据。
13 - 0005761-52.2014.4.02.5101 Lorem ipsum dolor sit amet.
Quisque eget velit a orci consectetur pharetra. Aliquam.
\n
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
a
Lorem ipsum dolor sit amet.
Lorem ipsum dolor sit amet - Sed ut tempus neque.
Sed ut tempus neque.
2 - 0117333-76.2015.4.02.5101 Lorem ipsum dolor sit amet
答案 0 :(得分:1)
您可以使用并选择不包含匹配项的行将其全部读入DataFrame:
import pandas as pd
df = pd.read_csv('test.txt', header=None, delimiter='|')
df = df[df[2].str.contains('MATCH') == False] # check column 2 from the example
或者,您可以找到要忽略的行,然后使用skiprows
的{{1}}参数:
pandas.read_csv
要按列号删除列,如果它们不需要或为空:
with open('test.txt') as f:
lines = f.readlines()
skiprows = [i for i, line in enumerate(lines) if 'MATCH' in line]
df = pd.read_csv('test.txt', skiprows=skiprows, header=None, delimiter='|')
要清除第2列中所有值的额外空格:
df = df.drop(df.columns[[0, 1, 3]], axis=1)
或者清理整个DataFrame中的空白:
df[2] = [' '.join(x.split()) for x in df[2]]