Pandas read_fwf не загружает все содержимое файла

У меня есть довольно большой файл с фиксированной шириной (~ 30 миллионов строк, 4 ГБ), и когда я попытался создать DataFrame с помощью pandas read_fwf(), он загрузил только часть файла, и мне было просто любопытно, была ли у кого-нибудь аналогичная проблема с этот парсер не читает все содержимое файла.

import pandas as pd

file_name = r"C:\....\file.txt"
fwidths = [3,7,9,11,51,51]

df = read_fwf(file_name, widths = fwidths, names = [col0, col1, col2, col3, col4, col5])
print df.shape #<30M

Если я наивно прочитаю файл в 1 столбец с помощью read_csv(), весь файл будет прочитан в память, и данные не будут потеряны.

import pandas as pd

file_name = r"C:\....\file.txt"

df = read_csv(file_name, delimiter = "|", names = [col0]) #arbitrary delimiter (the file doesn't include pipes)
print df.shape #~30M

Конечно, не видя содержимого или формата файла, он мог быть связан с чем-то на моей стороне, но хотел узнать, не возникало ли у кого-нибудь еще каких-либо проблем с этим в прошлом. Я проверил работоспособность и протестировал пару строк глубоко в файле, и все они, похоже, отформатированы правильно (дополнительная проверка, когда я смог перенести это в БД Oracle с помощью Talend, используя те же спецификации).

Дайте знать, если у кого есть идеи, было бы здорово запустить все через Python и не метаться туда-сюда, когда я начну разрабатывать аналитику.


person eroma934    schedule 11.12.2014    source источник


Ответы (1)


Несколько строк входного файла были бы полезны, чтобы увидеть, как выглядит дата. Тем не менее, я сгенерировал какой-то случайный файл похожего (думаю) формата, который есть у вас, и применил к нему pd.read_fwf. Это код для генерации и чтения:

из случайного импорта случайного

import pandas as pd


file_name = r"/tmp/file.txt"

lines_no = int(30e6)

with open(file_name, 'w') as f:
    for i in range(lines_no):
        if i%int(1e5) == 0:
            print("Writing progress: {:0.1f}%"
                    .format(float(i) / float(lines_no)*100), end='\r')
        f.write(" ".join(["{:<10.8f}".format(random()*10) for v in range(6)])+"\n")


print("File created. Now read it using pd.read_fwf ...")

fwidths = [11,11,11,11,11,11]

df = pd.read_fwf(file_name, widths = fwidths,
               names = ['col0', 'col1', 'col2', 'col3', 'col4', 'col5'])


#print(df)

print(df.shape) #<30M

Так что в этом случае, кажется, все работает нормально. Я использую Python 3.4, Ubuntu 14.04 x64 и pandas 0.15.1. Создание файла и чтение его с помощью pd.read_fwf занимает некоторое время. Но, похоже, это работает, по крайней мере, для меня и моей установки.

Результат: (30000000, 6)

Образец созданного файла:

7.83905215 9.64128377 9.64105762 8.25477816 7.31239330 2.23281189
8.55574419 9.08541874 9.43144800 5.18010536 9.06135038 2.02270145
7.09596172 7.17842495 9.95050576 4.98381816 1.36314390 5.47905083
6.63270922 4.42571036 2.54911162 4.81059164 2.31962024 0.85531626
2.01521946 6.50660619 8.85352934 0.54010559 7.28895079 7.69120905
person Marcin    schedule 11.12.2014