【问题标题】:csv module not writing new linecsv模块不写新行
【发布时间】:2021-12-31 18:03:56
【问题描述】:

我正在编写一个脚本,用于将 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

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

【问题讨论】:

  • 与其发布整个代码,不如考虑发布一个仅执行您遇到问题的任务的精简部分。例如,如果导入您的工作簿不是问题,请不要将其包含在您的帖子中。
  • 很抱歉。我只是不确定我是否在循环之前搞砸了某个地方,或者可能嵌套不正确。但我把它删掉了。
  • 我觉得你剪得太多了!基本上,为了提供帮助,有人需要一个示例,说明您正在使用什么数据、您正在获得什么输出以及您想要什么输出。但不要只发布输入的 XLS 文件,尽可能将数据带到最远的地方。作为指导,请查看此答案 stackoverflow.com/a/70539618/10245780 以了解您应该发布多少信息。
  • 请提供其他人可以运行的minimal reproducible example。包括这样做所需的任何输入数据的小样本。
  • 在您的代码中,您只有一个 record_writer.writerow(cell_values) 行 - 它不在循环中。如果你想要多行,你需要多个 writerow 调用:)

标签: python excel csv openpyxl


【解决方案1】:

您的主要问题是cell_values 正在从多张纸上累积单元格。您需要为每张纸重置它,例如 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

【讨论】:

  • 我将编辑并添加完整的 25 行代码。我早些时候把它做好了,因为我不确定其他人需要多少,但我被告知它太多了。
  • 我根据您的原始代码修改了答案,您非常接近。
猜你喜欢
  • 1970-01-01
  • 2018-05-30
  • 2014-02-11
  • 2016-12-04
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多