csv模块不写新行

csv module not writing new line

我正在编写一个脚本,用于将 Excel 工作簿中的特定单元格读取到列表中,然后从列表中读取到 CSV 中。还有一个循环可以从文件夹中打开工作簿。

我的代码:

import csv
import openpyxl
import os

path = r'C:\Users.....'  # Folder holding workbooks
workbooks = os.listdir(path)

cell_values = []  # List for storing cell values from worksheets

for workbook in workbooks:  # Workbook iteration
    wb = openpyxl.load_workbook(os.path.join(path, workbook), data_only=True)  # Open workbook
    sheet = wb.active  # Get sheet

    f = open('../record.csv', 'w', newline='')  # Open the CSV file
    cell_list = ["I9", "AK6", "N35"]  # List of cells to check

    with f:  # CSV writer loop
        record_writer = csv.writer(f)  # Open CSV writer

        for cells in cell_list:  # Loop through cell list to get cell values and write them to the cell_values list
            cell_values.append(sheet[cells].value)  # Append cell values to the cell_values list
        record_writer.writerow(cell_values)  # Write cell_values list to CSV

quit()  # Terminate program after all workbooks in the folder have been analyzed

输出只是将所有值放在同一行,尽管用逗号分隔,但如果所有内容都在同一行,当我在 Excel 中打开我的结果时,它对我没有帮助。当我使用 xlrd 时,格式是垂直的,但我所要做的就是将数据集转置为好的。但我不得不从 xlrd 更改(这通常是一个明智的举动),因为它不会读取合并的单元格。

我明白了:

4083940,140-21-541,NP,8847060,140-21-736,NP

当我想要这个时

4083940,140-21-541,NP
8847060,140-21-736,NP

编辑 - 我忘记了 post 的“我尝试过什么”部分。我尝试改变我的循环以避免覆盖之前对 CSV 的写入。我尝试清除每个循环中的列表,以使脚本将每个新条目视为一个新行。正如我在几个 post 中看到的那样,我尝试在 writer 行中添加 \n。我尝试使用 writerows 而不是 writerow。我尝试了 A 而不是 W,尽管它是一个修复而不是解决方案,但也不是很有效。

您的主要问题是 cell_values 正在累积来自多个 sheet 的单元格。您需要为每个 sheet.

重置它,例如 cell_values = []

我回到你原来的例子并且:

  • 将 record.csv 的开头向上移动,并将所有工作放在正在打开和写入的文件的范围内
  • cell_values = [] 移动到您的工作簿循环中
  • 已将 cell_list = ["I9", "AK6", "N35"] 移至顶部,因为如果每个工作簿都具有相同的单元格,那确实是整个脚本的范围
  • 删除了 quit(),在脚本的最后没有必要,通常应该避免:Python exit commands - why so many and when should each be used?
import csv
import openpyxl
import os

path = r'C:\Users.....'  # Folder holding workbooks
workbooks = os.listdir(path)

cell_list = ["I9", "AK6", "N35"]  # List of cells to check 

with open('record.csv', 'w', newline='') as f:
    record_writer = csv.writer(f)

    for workbook in workbooks:
        wb = openpyxl.load_workbook(os.path.join(path, workbook), data_only=True)
        sheet = wb.active
        cell_values = []  # reset for every sheet

        for cells in cell_list:
            cell_values.append(sheet[cells].value)

        # Write one row per sheet
        record_writer.writerow(cell_values)

此外,我可以看到您的新 CSV 模块,并且在概念上有点挣扎(因为您尝试了 writerow,然后 writerows,试图调试您的代码)。 Python 的 CSV 官方文档并没有真正给出 实际示例 如何使用它。尝试在此处阅读,Writing to a CSV