3 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超18個(gè)贊
首先,您需要檢查第一行是否是標(biāo)題。例如,您可以檢查第一行的任何條目是否以數(shù)字開(kāi)頭,因?yàn)檫@對(duì)于列標(biāo)題來(lái)說(shuō)不是典型的。事實(shí)上,在不知道您的數(shù)千個(gè)文件的情況下,正確的標(biāo)頭檢測(cè)方法只是猜測(cè) - 但這并不是您代碼中的真正重點(diǎn)。
要使用標(biāo)頭檢測(cè),您應(yīng)該使用普通循環(huán)而不是列表解析,以便您可以在每次迭代中: 1. 檢查標(biāo)頭 2. 讀取文件并將數(shù)據(jù)附加到數(shù)據(jù)幀:
df = pd.DataFrame()
for f in folder.glob("*.txt"):
with open(f) as fin:
chk_lst = next(fin).split()
is_h = not any(v[0].isdecimal() for v in chk_lst)
df = pd.concat([df, pd.read_csv(f, sep='\s+', header=(None, 0)[is_h])], axis=1)
# ISIN AVL_QTY 0 1
# 0 BAD 90000 TEST 543.775
# 1 AAB 8550000 HELLO 555.000
# 2 BAD 173688 STOCK 900.000
# 3 BAD 360000 CODE 785.000
# 4 BAD 90000 NaN NaN
# 5 BAD 810000 NaN NaN
# 6 BAD 900000 NaN NaN
# 7 BAD 900000 NaN NaN
編輯:
為了明智地連接行,您可以使用
df = pd.concat([df, pd.read_csv(f, sep='\s+', header=None, skiprows=(0, 1)[is_h])], axis=0, ignore_index=True)
# 0 1
# 0 BAD 90000
# 1 AAB 8550000
# 2 BAD 173688
# 3 BAD 360000
# 4 BAD 90000
# 5 BAD 810000
# 6 BAD 900000
# 7 BAD 900000
# 8 TEST 543
# 9 HELLO 555
# 10 STOCK 900
# 11 CODE 785

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
File2.txt
沒(méi)有標(biāo)題,對(duì)吧?但在_reader
你設(shè)置header
為None
. 將標(biāo)題添加到 File2.txt,看看會(huì)發(fā)生什么。

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
有幾種方法可以檢查 csv 文件是否有標(biāo)題
使用 csv 庫(kù)
import csv
with open('example.csv', 'rb') as csvfile:
sniffer = csv.Sniffer()
has_header = sniffer.has_header(csvfile.read(2048))
csvfile.seek(0)
# ...
或者如果你知道你的數(shù)據(jù),檢查第一行是否有任何數(shù)字
is_header = not any(cell.isdigit() for cell in csv_table[0])
或使用熊貓本身,如果您知道標(biāo)題可能會(huì)被稱(chēng)為什么
df = (pd.read_csv(filename, header=None, names=cols)
[lambda x: np.ones(len(x)).astype(bool)
if (x.iloc[0] != cols).all()
else np.concatenate([[False], np.ones(len(x)-1).astype(bool)])]
)
當(dāng)然,如果你想先用命令行預(yù)處理文件,它可能會(huì)更快......
添加回答
舉報(bào)