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