Не вижу смысла в read_fwf в пандах. Зачем мне использовать это вместо read_csv, которое поддерживает настраиваемые разделители? Я попытался протестировать как скорость для большого файла с фиксированной шириной столбца, так и read_csv
намного быстрее:
data = ("colum1 column2222 column3333 column4\n"
"id8141 360.242940 149.910199 11950.7\n"
"id1594 444.953632 166.985655 11788.4\n"
)
colspecs = [(0, 6), (8, 20), (21, 33), (34, 43)]
data = data * 10000000
with open("big_file.txt", "w") as f:
f.write(data)
start_time = time.time()
df = pd.read_csv("big_file.txt", header=None, dtype = {"colum1": str, "column2222": float, "column3333": float, "column4":float}, sep = "\s+")
print(f"--- {time.time() - start_time} seconds ---")
--- 4.0295188426971436 seconds ---
start_time = time.time()
df = pd.read_fwf("big_file.txt", header=None, colspecs=colspecs,
dtype = {"colum1": str, "column2222": float, "column3333": float, "column4":float})
print(f"--- {time.time() - start_time} seconds ---")
--- 77.41955280303955 seconds ---
Также обратите внимание, что в FWF может не быть никакого разделителя между полями.
Из документации я бы предположил, что read_fwf
используется для другой структуры данных. fwf — это аббревиатура от «текстовый файл фиксированной ширины». Я предполагаю, что шаги проверки read_fwf
более специализированы для подсчета пробелов, что может привести к увеличению времени обработки.
@buran извините, я забыл включить sep = \s+
. Включил сейчас. Но да, я не думал о случае без разделителя, но похоже, что это единственный вариант использования
@MaKaNu да, но тогда какой в этом смысл?
оформить заказ documentation.abila.com/MAD_MAIN/Content/MAD/… для примера fwf без разделителя
Я не верю, что существование функции read_fwf в API панд служит эстетическим целям. Разработчики ядра сделали эту функцию доступной для нас, понимая, что в определенных обстоятельствах это единственное эффективное средство правильного чтения текстового файла как DataFrame.
Один из примеров, который я вижу (где read_fwf
пригодится), — это (.txt
) файл ниже:
87 foo
341 5
bar 1
Если вы не придумаете разделитель магии/регулярных выражений, read_csv не сможет правильно проанализировать 3 столбца.
df = pd.read_fwf("file.txt", widths=[4, 5, 4], names=["A", "B", "C"])
print(df)
A B C
0 87 NaN foo
1 NaN 341.0 5.0
2 bar 1.0 NaN
Вы проверили, что в примере
read_csv
создаст DF только с одним столбцом вместо 4?