#python #python-3.x #pandas #text
#python #python-3.x #pandas #текст
Вопрос:
Если у меня есть несколько текстовых файлов, которые мне нужно проанализировать, они выглядят примерно так, но могут различаться по названиям столбцов и длине хэштегов выше:
Как бы я мог превратить это в фрейм данных pandas? Я пробовал использовать pd.read_table('file.txt', delim_whitespace = True, skiprows = 14)
, но у него были всевозможные проблемы. Мои проблемы таковы…
Весь текст, звездочки и фунты вверху должны быть проигнорированы, но я не могу просто использовать пропущенные строки, потому что размер всего мусора наверху может отличаться по длине в другом файле.
Столбцы «stat ( /-)» и «syst ( /-)» отображаются как 4 столбца из-за пробела.
Знак одного фунта включен в названия столбцов, а я этого не хочу. Я не могу просто присвоить имена столбцов вручную, потому что они варьируются от текстового файла к текстовому файлу.
Любая помощь очень важна, я просто не совсем уверен, с чего начать после того, как прочитаю файл с помощью pandas.
Комментарии:
1. Последний фунт — это проблема с убийством. Не передавайте имя файла pandas: откройте файловый объект и считывайте, пока не найдете последнюю строку с фунтом, найдите указатель файла на это местоположение, затем используйте read_fwf, указав размер, который вы можете найти в первой части данных, которые вы также прочитали в этом процессе
2. Как мне прочитать его до последней строки pound?
Ответ №1:
Рассмотрите возможность чтения в необработанном файле, очистки его построчно при записи в новый файл с помощью csv
модуля. Регулярное выражение используется для идентификации заголовков столбцов с использованием i в качестве критерия соответствия. Ниже предполагается, что столбцы разделены более чем одним пробелом:
import os
import csv, re
import pandas as pd
rawfile = "path/To/RawText.txt"
tempfile = "path/To/TempText.txt"
with open(tempfile, 'w', newline='') as output_file:
writer = csv.writer(output_file)
with open(rawfile, 'r') as data_file:
for line in data_file:
if re.match('^.*i', line): # KEEP COLUMN HEADER ROW
line = line.replace('n', '')
row = line.split(" ")
writer.writerow(row)
elif line.startswith('#') == False: # REMOVE HASHTAG LINES
line = line.replace('n', '')
row = line.split(" ")
writer.writerow(row)
df = pd.read_csv(tempfile) # IMPORT TEMP FILE
df.columns = [c.replace('# ', '') for c in df.columns] # REMOVE '#' IN COL NAMES
os.remove(tempfile) # DELETE TEMP FILE
Ответ №2:
Это способ, о котором я упоминаю в комментарии: он использует объект file, чтобы пропустить пользовательские грязные данные, которые вам нужно пропустить в начале. Вы помещаете смещение файла в соответствующее место в файле, где read_fwf
просто выполняется задание:
with open(rawfile, 'r') as data_file:
while(data_file.read(1)=='#'):
last_pound_pos = data_file.tell()
data_file.readline()
data_file.seek(last_pound_pos)
df = pd.read_fwf(data_file)
df
Out[88]:
i mult stat ( /-) syst ( /-) Q2 x x.1 Php
0 0 0.322541 0.018731 0.026681 1.250269 0.037525 0.148981 0.104192
1 1 0.667686 0.023593 0.033163 1.250269 0.037525 0.150414 0.211203
2 2 0.766044 0.022712 0.037836 1.250269 0.037525 0.149641 0.316589
3 3 0.668402 0.024219 0.031938 1.250269 0.037525 0.148027 0.415451
4 4 0.423496 0.020548 0.018001 1.250269 0.037525 0.154227 0.557743
5 5 0.237175 0.023561 0.007481 1.250269 0.037525 0.159904 0.750544
Комментарии:
1. Большое вам спасибо! Знаете ли вы, в любом случае, я мог бы расширить это на . СПИСОК файлов?