пытаясь понять генераторы с примером кода - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь понять, как работают генераторы, преобразовав файлы с разделителями "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'}]}
...