импортировать текстовые данные с пробелами, используя pandas.read_csv - PullRequest
0 голосов
/ 19 декабря 2018

Я хотел бы импортировать текстовый файл, используя pandas.read_csv:

1541783101     8901951488  file.log             12345  123456
1541783401     21872967680  other file.log       23456     123
1541783701     3  third file.log 23456     123

Сложность заключается в том, что столбцы разделены одним или несколькими пробелами, но есть один столбец, который содержит имя файлаимея пробелы.Поэтому я не могу использовать sep=r"\s+", чтобы идентифицировать столбцы, так как это не удастся при первом имени файла с пробелом.Формат файла не имеет фиксированной ширины столбца.

Однако каждое имя файла заканчивается на «.log».Я мог бы написать отдельные регулярные выражения, соответствующие каждому столбцу.Можно ли использовать их для идентификации столбцов для импорта?Или можно написать регулярное выражение разделителя, которое выбирает все символы, НЕ соответствующие ни одному из столбцов, соответствующих регулярным выражениям?

1 Ответ

0 голосов
/ 19 декабря 2018

Ответ на обновленный вопрос -

Вот код, который не потерпит неудачу, какой бы ни была ширина данных.Вы можете изменить его в соответствии со своими потребностями.

df = pd.read_table('file.txt', header=None)

# Replacing uneven spaces with single space
df = df[0].apply(lambda x: ' '.join(x.split()))

# An empty dataframe to hold the output
out = pd.DataFrame(np.NaN, index=df.index, columns=['col1', 'col2', 'col3', 'col4', 'col5'])

n_cols = 5      # number of columns
for i in range(n_cols-2):
    # 0 1
    if i == 0 or i == 1:
        out.iloc[:, i] = df.str.partition(' ').iloc[:,0]
        df = df.str.partition(' ').iloc[:,2]
    else:
        out.iloc[:, 4] = df.str.rpartition(' ').iloc[:,2]
        df = df.str.rpartition(' ').iloc[:,0]
        out.iloc[:,3] = df.str.rpartition(' ').iloc[:,2]
        out.iloc[:,2] = df.str.rpartition(' ').iloc[:,0]

print(out)

+---+------------+-------------+----------------+-------+--------+
|   |    col1    |      col2   |       col3     |   col4 |   col5 |
+---+------------+-------------+----------------+-------+--------+
| 0 | 1541783101 |  8901951488 | file.log       | 12345 | 123456 |
| 1 | 1541783401 | 21872967680 | other file.log | 23456 |    123 |
| 2 | 1541783701 |           3 | third file.log | 23456 |    123 |
+---+------------+-------------+----------------+-------+--------+

Примечание. Код жестко запрограммирован для 5 столбцов.Он также может быть обобщен.

Предыдущий ответ -

Используйте pd.read_fwf() для чтения файлов с фиксированной шириной.

В вашемcase:

pd.read_fwf('file.txt', header=None)

+---+----------+-----+-------------------+-------+--------+
|   |    0     |  1  |         2         |   3   |   4    |
+---+----------+-----+-------------------+-------+--------+
| 0 | 20181201 |   3 | file.log          | 12345 | 123456 |
| 1 | 20181201 |  12 | otherfile.log     | 23456 |    123 |
| 2 | 20181201 | 200 | odd file name.log | 23456 |    123 |
+---+----------+-----+-------------------+-------+--------+
...