Как изменить разделитель полей файла с помощью Python? - PullRequest
2 голосов
/ 18 мая 2011

Я новичок в Python из мира R, и я работаю над большими текстовыми файлами, структурированными по столбцам данных (это данные LiDaR, так что обычно 60 миллионов записей +).

Это так?можно изменить разделитель полей (например, от табуляции до запятой) такого большого файла без необходимости читать файл и делать цикл for в строках?

Ответы [ 4 ]

6 голосов
/ 18 мая 2011

Нет.

  • Чтение файла в
  • Изменение разделителей для каждой строки
  • Запись каждой строки обратно

Это легко сделать, простоНесколько строк Python (не проверено, но общий подход работает):

# Python - it's so readable, the code basically just writes itself ;-)
#
with open('infile') as infile:
  with open('outfile', 'w') as outfile:
    for line in infile:
      fields = line.split('\t')
      outfile.write(','.join(fields))

Я не знаком с R, но если он имеет библиотечную функцию для этого, он, вероятно, делает то же самое.

Обратите внимание, что этот код читает только одну строку за раз из файла, поэтому файл может быть больше физической ОЗУ - он никогда не загружается целиком.

1 голос
/ 06 апреля 2018

На самом деле давайте скажем да, вы можете сделать это без циклов, например:

with open('in') as infile:
  with open('out', 'w') as outfile:
      map(lambda line: outfile.write(','.join(line.split('\n'))), infile)
1 голос
/ 12 декабря 2011

Вы можете использовать команду linux tr для замены любого символа любым другим символом.

0 голосов
/ 18 мая 2011

Вы не можете, но я настоятельно советую вам проверить генераторы.

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

Например

file = open("bigfile","w")
j = (i.split("\t") for i in file)
s = (","join(i) for i in j)
#and now magic happens
for i in s:
     some_other_file.write(i)

Этот код тратит память на удержание только одной строки.

...