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