2016-06-15 3 views
1

Я хотел бы напечатать мой словарь TimeSheet в файл CSV. Однако он записывает последнюю строку в мой CSV-файл. Как я могу это исправить? Я могу распечатать все содержимое из моего TimeSheet в консоли, но не все словарные отпечатки в CSV.Печать словаря в CSV-файл с Python

import glob 
import openpyxl 
import csv 
#loops through .xlsx files in folder path 
path = 'C:/ExcelFolder/*.xlsx' 
files = glob.glob(path) 
for file in files: 
    #selects specific cells in title sheet. 
    wb = openpyxl.load_workbook(file) 
    sheet = wb.get_sheet_by_name('Sheet2') 
    Week = sheet.cell(row=1, column=1).value 
    Date = sheet.cell(row=2, column=1).value 
    Name = sheet.cell(row=4, column=2).value 
    Title = sheet.cell(row=5, column=2).value 
    Site = sheet.cell(row=6, column=2).value 
    LocID = sheet.cell(row=7, column=2).value 
    for n in range(2, 9): 
     sheets = wb.worksheets[n] 
     Days = wb.worksheets[n] 
     for i in range(1, 57): 
      From = sheets.cell(row=i, column=1).value 
      To = sheets.cell(row=i, column=2).value 
      Activity = sheets.cell(row=i, column=3).value 
      TimeSheet = {'Week': Week, 'Date': Date, 'Name': Name, 'Title': Title, 'Site': Site, 'LocID': LocID, 'Days': Days, 'From': From, 'To': To, 'Activity': Activity} 
      with open('TestOutput.csv', 'w') as csvfile: 
       TimeSheet = {'Week': Week, 'Date': Date, 'Name': Name, 'Title': Title, 'Site': Site, 'LocID': LocID, 
          'Days': Days, 'From': From, 'To': To, 'Activity': Activity} 
       fieldnames = ['Week', 'Date', 'Name', 'Title', 'Site', 'LocID', 'Days', 'From', 'To', 'Activity'] 
       writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
       writer.writeheader() 
       writer.writerow(
        {'Week': Week, 'Date': Date, 'Name': Name, 'Title': Title, 'Site': Site, 'LocID': LocID, 'Days': Days, 'From': From, 'To': To, 'Activity': Activity}) 

       print(TimeSheet) 

Консольный вывод:

{'Site': 'moon LV-426', 'Activity': None, 'From': datetime.time(18, 45), 'Title': 'Private Hudson', 'Week': 'Week 3', 'To': datetime.time(19, 0), 'Days': <Worksheet "Saturday">, 'Name': 'Bill Paxton', 'Date': '2016/5/22-2016/5/28', 'LocID': '4220A'} 
{'Site': 'moon LV-426', 'Activity': None, 'From': datetime.time(19, 0), 'Title': 'Private Hudson', 'Week': 'Week 3', 'To': datetime.time(19, 15), 'Days': <Worksheet "Saturday">, 'Name': 'Bill Paxton', 'Date': '2016/5/22-2016/5/28', 'LocID': '4220A'} 
{'Site': 'moon LV-426', 'Activity': None, 'From': datetime.time(19, 15), 'Title': 'Private Hudson', 'Week': 'Week 3', 'To': datetime.time(19, 30), 'Days': <Worksheet "Saturday">, 'Name': 'Bill Paxton', 'Date': '2016/5/22-2016/5/28', 'LocID': '4220A'} 
{'Site': 'moon LV-426', 'Activity': None, 'From': datetime.time(19, 30), 'Title': 'Private Hudson', 'Week': 'Week 3', 'To': datetime.time(19, 45), 'Days': <Worksheet "Saturday">, 'Name': 'Bill Paxton', 'Date': '2016/5/22-2016/5/28', 'LocID': '4220A'} 

CSV выход: enter image description here

ответ

2

Проблема заключается в том, вероятно, что вы восстановите файл CSV для каждой итерации.
Он должен работать, когда вы перемещаете создание файла CSV, включая. товарной линии из внутреннего контура, как так:

import glob 
import openpyxl 
import csv 

#loops through .xlsx files in folder path 

with open('TestOutput.csv', 'w') as csvfile: 
    fieldnames = ['Week', 'Date', 'Name', 'Title', 'Site', 'LocID', 'Days', 'From', 'To', 'Activity'] 
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
    writer.writeheader() 

    path = 'C:/ExcelFolder/*.xlsx' 
    files = glob.glob(path)  
    for file in files: 
     #selects specific cells in title sheet. 
     wb = openpyxl.load_workbook(file) 
     sheet = wb.get_sheet_by_name('Sheet2') 
     Week = sheet.cell(row=1, column=1).value 
     Date = sheet.cell(row=2, column=1).value 
     Name = sheet.cell(row=4, column=2).value 
     Title = sheet.cell(row=5, column=2).value 
     Site = sheet.cell(row=6, column=2).value 
     LocID = sheet.cell(row=7, column=2).value 
     for n in range(2, 9): 
      sheets = wb.worksheets[n] 
      Days = wb.worksheets[n] 
      for i in range(1, 57): 
       From = sheets.cell(row=i, column=1).value 
       To = sheets.cell(row=i, column=2).value 
       Activity = sheets.cell(row=i, column=3).value 
       TimeSheet = {'Week': Week, 'Date': Date, 'Name': Name, 'Title': Title, 'Site': Site, 'LocID': LocID, 'Days': Days, 'From': From, 'To': To, 'Activity': Activity}              
       writer.writerow(
        {'Week': Week, 'Date': Date, 'Name': Name, 'Title': Title, 'Site': Site, 'LocID': LocID, 'Days': Days, 'From': From, 'To': To, 'Activity': Activity}) 
       print(TimeSheet) 
+0

Я вижу вашу точку зрения, однако, когда я переехал открытый вызов внутреннего цикл не печатает или записывает файл CSV файл. – wisenhiemer

+0

Я не говорю о том, чтобы переместить его во внутреннюю петлю, но из петли вообще – DAXaholic

+0

А теперь я вижу, спасибо. – wisenhiemer

1

Вопрос заключается в «TestOutput.csv» открыт для каждой строки с режимом «W», который будет усекать файл (см https://docs.python.org/3/library/functions.html#open). Он записывает только последнюю строку, потому что все остальные были удалены.

С первого взгляда вам нужно переместить вызов open() и writeheader() перед повторением списка файлов.

1

Как указано в предыдущих ответах, создайте файл CSV перед началом работы.

Если вы хотите, чтобы один csv консолидировал все данные из файла (ов) Excel, решение от DAXaholic должно работать.

Если вы хотите, чтобы файл CSV для каждого первенствует файл, следующий может помочь:

import glob 
import openpyxl 
import csv 
# loops through .xlsx files in folder path 
path = 'C:/ExcelFolder/*.xlsx' 
files = glob.glob(path) 
fieldnames = ['Week', 'Date', 'Name', 'Title', 'Site', 'LocID', 'Days', 'From', 'To', 'Activity'] 
for file in files: 
    # selects specific cells in title sheet. 
    wb = openpyxl.load_workbook(file) 
    sheet = wb.get_sheet_by_name('Sheet2') 
    Week = sheet.cell(row=1, column=1).value 
    Date = sheet.cell(row=2, column=1).value 
    Name = sheet.cell(row=4, column=2).value 
    Title = sheet.cell(row=5, column=2).value 
    Site = sheet.cell(row=6, column=2).value 
    LocID = sheet.cell(row=7, column=2).value 

    # append the extension .csv to the current filename 
    csvfilename = "{}.csv".format(file) 
    with open(csvfilename, 'w') as csvfile: 
     writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 
     writer.writeheader() 
     for n in range(2, 9): 
      sheets = wb.worksheets[n] 
      Days = wb.worksheets[n] 
      for i in range(1, 57): 
       From = sheets.cell(row=i, column=1).value 
       To = sheets.cell(row=i, column=2).value 
       Activity = sheets.cell(row=i, column=3).value 
       TimeSheet = {'Week': Week, 'Date': Date, 'Name': Name, 'Title': Title, 'Site': Site, 'LocID': LocID, 'Days': Days, 'From': From, 'To': To, 'Activity': Activity} 
       writer.writerow(TimeSheet) 
       print(TimeSheet) 
Смежные вопросы