Я пытаюсь понять, как работают генераторы, преобразовав файлы с разделителями "pipe" в файлы csv (3 файла).
Когда я запускаю приведенный ниже код, он только конвертирует и записывает 1 файл csv (c.csv).
Я ожидал, что он преобразует и записывает все три файла (a.csv, b.csv & c.csv)
Эксперты, не могли бы вы помочь мне понять, почемуне конвертирует 3 файла?
Данные в каждом файле (3 файла):
country|city
Код:
from typing import Iterator, Iterable
ret={
"data": [
{
"src": "/Users/home/Desktop/python/a.txt"
},
{
"src": "/Users/home/Desktop/python/b.txt"
},
{
"src": "/Users/home/Desktop/python/c.txt"
}]}
def extract(files:Iterable[dict])-> Iterator[dict]:
for file in files:
ret = file.copy()
with open(file['src']) as f:
ret['data']=f.read()
yield ret
def transform(files: Iterable[dict]) -> Iterator[dict]:
for file in files:
df = file_to_df(file["data"])
ret = file.copy()
ret['data']=df
yield ret
def load(files: Iterable[dict]) -> Iterator[dict]:
for file in files:
f = open(file['src'].replace(".txt",".csv"),'w')
f.write(file['data'])
ret = dict(file)
ret['dest']=file['src'].replace(".txt",".csv")
yield ret
# Convert pipe to comma
def file_to_df (file:str, boilerplate_stripped=False):
df = file.replace("|",",")
return df
# Transform pipe delimited files to csv
raw_files = extract(ret['data'])
transform_files = transform(raw_files)
load_files = load(transform_files)
keep_keys = ['src', 'dest']
ret = {
"data": [dict({k: v for k, v in x.items() if k in keep_keys}) for x in load_files]
}
print (ret)
Результат:
{'data': [{'src': '/Users/home/Desktop/python/c.txt', 'dest': '/Users/home/Desktop/python/c.csv'}]}
Ожидаемый результат:
{'data': [{'src': '/Users/home/Desktop/python/a.txt', 'dest': '/Users/home/Desktop/python/a.csv'},
{'src': '/Users/home/Desktop/python/b.txt', 'dest': '/Users/home/Desktop/python/b.csv'},
{'src': '/Users/home/Desktop/python/c.txt', 'dest': '/Users/home/Desktop/python/c.csv'}]}