#python #excel #csv #powerbi
#python #excel #csv #powerbi
Вопрос:
Я загрузил zip-файл с mailchimp. Zip-файл содержит папки и вложенные папки с файлами csv. Что я хотел бы сделать, так это написать программу, которая извлекла бы все файлы .csv в один каталог, а затем преобразовала их в файлы .xlsx.
В качестве альтернативы, если бы он просто копировал или заменял файлы .csv в те же каталоги, это нормально. Я хочу, чтобы они были источником для PowerBI. Я не смог использовать API для успешной интеграции с PowerBI.
У меня есть два сценария, которые я использовал, с разными проблемами. Как вы можете видеть ниже, я пытаюсь использовать скрипт, который успешно конвертирует файлы .csv, но заставляет его выполнять итерации по папкам и вложенным папкам.
Первый сценарий: проблема в том, что он не выполняет итерацию по файлам Excel в папках и вложенных папках. Он печатает «Текущая папка» и одновременно преобразует только файлы .csv в каталоге данных /Mailchimp.
import shutil
#os.chdir('F:CRMMailchimp data')
for folderName, subfolders, filenames in os.walk('F:CRMMailchimp data'):
print("The current folder is " folderName)
for csvfile in glob.glob(os.path.join('.', '*.csv')):
workbook = Workbook(csvfile[:-4] '.xlsx')
worksheet = workbook.add_worksheet()
with open(csvfile, 'rt', encoding='utf8') as f:
reader = csv.reader(f)
for r, row in enumerate(reader):
for c, col in enumerate(row):
worksheet.write(r, c, col)
workbook.close()
Второй сценарий: та же проблема, он продолжает конвертировать файлы .csv в основной папке, но не будет проходить через другие папки и вложенные папки.
entries = os.listdir('F:CRMMailchimp data')
for entry in entries:
for csvfile in glob.glob(os.path.join('.', '*.csv')):
workbook = Workbook(csvfile[:-4] '.xlsx')
worksheet = workbook.add_worksheet()
with open(csvfile, 'rt', encoding='utf8') as f:
reader = csv.reader(f)
for r, row in enumerate(reader):
for c, col in enumerate(row):
worksheet.write(r, c, col)
workbook.close()
Комментарии:
1. почему вы используете
'.'
вglob
?os.walk()
иos.listdir()
не изменяет активную папку и'.'
всегда означает ту же основную папку. Вы должны использоватьfolderName
вместо'.'
вos.path.join(folderName, '*.csv')
. То же самое сos.path.join(entry, '*.csv')
2. Несколько быстрых заметных вещей, которые вы можете проверить: 1. защитите пути Windows с помощью
в строках, используя
r
префикс перед строковым литералом, иначеt
,n
и т.д. станут escape-последовательностями. 2. то, что сказал @furas, объединение пути с «.» ничего не делает, вы, вероятно, имели в виду что-то другое.