python - импорт csv - фильтрация по столбцу - запись в текстовый файл с временной меткой - проблемы с выводом текста

Первый пост, постарайтесь не злиться на мое форматирование.

Я пытаюсь выполнить ETL для файла csv с python 3.5 - код, который я успешно удаляю, фильтрует по правильному столбцу, создает желаемый конечный результат в переменной "new_string" и создает файл txt с правильным именем в конце выполнения. Но открытие txt-файла показывает, что его длина составляет всего один символ, если бы это был индекс i = [1], это единственное, что я обнаружил, я ожидал, что весь столбец будет распечатан в строковом формате... очевидно, я не принимаю форматирование списка / строки во внимание, но я застрял на данный момент.

Если кто-то видит, что здесь что-то происходит. Я был бы признателен за головы. Заранее спасибо...

вот мой код:

cdpath = os.getcwd()

def get_file_path(filename):
   currentdirpath = os.getcwd()
   file_path = os.path.join(os.getcwd(), filename)
   print (file_path)
   return file_path

path = get_file_path('cleanme.csv')  ## My test file to work on

def timeStamped(fname, fmt='%Y-%m-%d-%H-%M-%S_{fname}'):   ##Time stamp func
     return datetime.datetime.now().strftime(fmt).format(fname=fname)

def read_csv(filepath):
    with open(filepath, 'rU') as csvfile:
       reader = csv.reader(csvfile)
       for row in reader:
         new_list = row[2]
         new_string = str(new_list)
         print (new_string)

    with open(timeStamped('cleaned.txt'),'w') as outf:
        outf.write(new_string)

1 ответ

Решение

В вашем коде у вас есть:

def read_csv(filepath):
    with open(filepath, 'rU') as csvfile:
       reader = csv.reader(csvfile)
       for row in reader:
         new_list = row[2]
         new_string = str(new_list)
         print (new_string)

    with open(timeStamped('cleaned.txt'),'w') as outf:
        outf.write(new_string)

Как отмечалось в моем комментарии выше, возник некоторый вопрос о том, был ли второй отступ с правильным отступом, но на самом деле это не имеет значения:

Вы генерируете new_string внутри цикла for (for row in reader). Но поскольку вы не используете его внутри цикла (кроме его распечатки), когда цикл завершится, единственным значением, к которому у вас будет доступ, будет последний элемент.

В качестве альтернативы, если у вас был with ... as outf как часть цикла, каждый раз, когда вы через него открываете новую копию и перезаписываете данные, так что cleaned.txt снова имеет только последнее значение в конце.

Я думаю, что вы хотите что-то вроде:

def read_csv(filepath):
    with open(filepath, 'rU') as csvfile:
      with open(timeStamped('cleaned.txt'),'w') as outf:
        reader = csv.reader(csvfile)
        for row in reader:
          new_list = row[2] #extract the 3rd column of each row
          new_string = str(new_list) # optionally do some transforms here
          print (new_string) #debug
          outf.write(new_string) #store result
Другие вопросы по тегам