Обработка большого отдельного файла с помощью разных программ чтения PythonPython

Программы на Python
Ответить
Anonymous
 Обработка большого отдельного файла с помощью разных программ чтения Python

Сообщение Anonymous »

Я хочу обрабатывать текстовые файлы, содержащие несколько документов в разных форматах. Документы разделяются тремя дефисами, как в YAML.

Код: Выделить всё

Example: Here we have some YAML code
PartOne: It is the first of three parts
---
Column1,Column2,Column3
The,second,part
is,a,CSV
---
[ "The third and last part",
"is some JSON"
]
Существуют модули Python, позволяющие легко анализировать все компоненты. Обычно они читают объекты файлов. Итак, сначала необходимо разделить компоненты. Это можно сделать, прочитав весь файл, разделив компоненты на части и затем снова обернув их в StringIO, чтобы они действовали как файловый объект.

Код: Выделить всё

import pathlib, io, yaml, csv, json
partone, parttwo, partthree = pathlib.Path("file").read_text().split("\n---\n")
print(yaml.load(io.StringIO(partone)))
print(tuple(csv.reader(io.StringIO(parttwo))))
print(json.load(io.StringIO(partthree)))
Однако этот подход требует чтения и хранения в памяти всего файла или хотя бы одного целого компонента. Это чрезмерно, особенно для крупных компонентов. Поэтому я ищу альтернативу, которая может обрабатывать файл в потоковом режиме, останавливаясь при этом на разделителях.
Оптимально я бы представлял себе итератор файловых объектов, которые можно читать по порядку.

Код: Выделить всё

with open("file") as file:
components = splitfile(file, "\n---\n")
print(yaml.load(next(components)))
print(tuple(csv.reader(next(components))))
print(json.load(next(components)))
Или еще более компактным может быть файловый объект многократного использования, который сообщает о каждом разделителе как о промежуточном конце файла.

Код: Выделить всё

with splitfile(open("file"), "\n---\n") as file:
print(yaml.load(file))
print(tuple(csv.reader(file)))
print(json.load(file))
Я подумал о реализации последнего в виде оболочки файлового объекта. Но обработка всех крайних случаев оказалась довольно сложной, особенно когда разделитель считывается только частично, например. из-за аргумента size методов read или readline.
Существует ли библиотека Python или рецепт, который поможет мне создать такую ​​функцию разделения файла?

Подробнее здесь: https://stackoverflow.com/questions/793 ... on-readers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»