读取列 headers 中包含多个定界符的文件并在末尾跳过一些行
Reading files with multiple delimiter in column headers and skipping some rows at the end
我是 Python
的新手,我想使用 pandas
来读取数据。我已经做了一些搜索和努力来解决我的问题,但我仍然在挣扎。提前感谢您的帮助!
我有 a.txt 个这样的文件;
skip1
A1| A2 |A3 |A4# A5# A6 A7| A8 , A9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
END***
Some other data starts from here
首要任务是
我想指定 A1、A2、A3、A4、A5、A6、A7、A8 和 A9 作为列名。但是,有多个分隔符,例如 ' ','|','#'
,这使得在读取文件时分配分隔符变得很麻烦。我这样试过;
import pandas as pd
import glob
filelist=glob.glob('*.txt')
print(filelist)
df = pd.read_csv(filelist,skiprows=1,skipfooter=2,skipinitialspace=True, header=0, sep=r'\| |,|#',engine='python')
但是我查看Spyder的data explorer df时好像没有任何反应。
第二个任务是在读取过程中删除我不需要的以 END***
行开头的数据。 header 的长度始终相同。但是,skipfooter 需要跳过的行数,应该在文件之间更改。
已经问了几个问题,但似乎我无法让它们解决我的问题!
pandas-read-delimited-file?
import-text-to-pandas-with-multiple-delimiters
pandas-ignore-all-lines-following-a-specific-string-when-reading-a-file-into-a
编辑:关于删除以行 END
开头的数据的读数
如果b.txt这样的文件
b.txt
skip1
A1| A2 |A3 |A4# A5# A6 A7| A8 , A9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
END123
Some other data starts from here
使用下面的第二种解决方案;
txt = open('b.txt').read().split('\nEND')[0]
_, h, txt = txt.split('\n', 2)
pat = r'[\|, ,#,\,]+'
names = re.split(pat, h.strip())
pd.read_csv(
pd.io.common.StringIO(txt),
names=names, header=None,
engine='python')
得到这个,
A1 A2 A3 A4 A5 A6 A7 A8 A9
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 1 2 3 4 5 6 7 8 9
回答第一个问题:
In [182]: df = pd.read_csv(filename, sep=r'\s*(?:\||\#|\,)\s*',
skiprows=1, engine='python')
In [183]: df
Out[183]:
A1 A2 A3 A4 A5 A6 A7 A8 A9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
拆分文件,然后从字符串中读取
txt = open('test.txt').read().split('\nEND***')[0]
pd.read_csv(
pd.io.common.StringIO(txt),
sep=r'\W+',
skiprows=1, engine='python')
A1 A2 A3 A4 A5 A6 A7 A8 A9
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 1 2 3 4 5 6 7 8 9
我们可以非常明确地解析 header 并将文件的其余部分解析为 csv
txt = open('test.txt').read().split('\nEND***')[0]
_, h, txt = txt.split('\n', 2)
pat = r'[\|, ,#,\,]+'
names = re.split(pat, h.strip())
pd.read_csv(
pd.io.common.StringIO(txt),
names=names, header=None,
engine='python')
A1 A2 A3 A4 A5 A6 A7 A8 A9
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 1 2 3 4 5 6 7 8 9
我是 Python
的新手,我想使用 pandas
来读取数据。我已经做了一些搜索和努力来解决我的问题,但我仍然在挣扎。提前感谢您的帮助!
我有 a.txt 个这样的文件;
skip1
A1| A2 |A3 |A4# A5# A6 A7| A8 , A9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
END***
Some other data starts from here
首要任务是
我想指定 A1、A2、A3、A4、A5、A6、A7、A8 和 A9 作为列名。但是,有多个分隔符,例如 ' ','|','#'
,这使得在读取文件时分配分隔符变得很麻烦。我这样试过;
import pandas as pd
import glob
filelist=glob.glob('*.txt')
print(filelist)
df = pd.read_csv(filelist,skiprows=1,skipfooter=2,skipinitialspace=True, header=0, sep=r'\| |,|#',engine='python')
但是我查看Spyder的data explorer df时好像没有任何反应。
第二个任务是在读取过程中删除我不需要的以 END***
行开头的数据。 header 的长度始终相同。但是,skipfooter 需要跳过的行数,应该在文件之间更改。
已经问了几个问题,但似乎我无法让它们解决我的问题!
pandas-read-delimited-file?
import-text-to-pandas-with-multiple-delimiters
pandas-ignore-all-lines-following-a-specific-string-when-reading-a-file-into-a
编辑:关于删除以行 END
如果b.txt这样的文件 b.txt
skip1
A1| A2 |A3 |A4# A5# A6 A7| A8 , A9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
1,2,3,4,5,6,7,8,9
END123
Some other data starts from here
使用下面的第二种解决方案;
txt = open('b.txt').read().split('\nEND')[0]
_, h, txt = txt.split('\n', 2)
pat = r'[\|, ,#,\,]+'
names = re.split(pat, h.strip())
pd.read_csv(
pd.io.common.StringIO(txt),
names=names, header=None,
engine='python')
得到这个,
A1 A2 A3 A4 A5 A6 A7 A8 A9
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 1 2 3 4 5 6 7 8 9
回答第一个问题:
In [182]: df = pd.read_csv(filename, sep=r'\s*(?:\||\#|\,)\s*',
skiprows=1, engine='python')
In [183]: df
Out[183]:
A1 A2 A3 A4 A5 A6 A7 A8 A9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
拆分文件,然后从字符串中读取
txt = open('test.txt').read().split('\nEND***')[0]
pd.read_csv(
pd.io.common.StringIO(txt),
sep=r'\W+',
skiprows=1, engine='python')
A1 A2 A3 A4 A5 A6 A7 A8 A9
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 1 2 3 4 5 6 7 8 9
我们可以非常明确地解析 header 并将文件的其余部分解析为 csv
txt = open('test.txt').read().split('\nEND***')[0]
_, h, txt = txt.split('\n', 2)
pat = r'[\|, ,#,\,]+'
names = re.split(pat, h.strip())
pd.read_csv(
pd.io.common.StringIO(txt),
names=names, header=None,
engine='python')
A1 A2 A3 A4 A5 A6 A7 A8 A9
0 1 2 3 4 5 6 7 8 9
1 1 2 3 4 5 6 7 8 9
2 1 2 3 4 5 6 7 8 9