【问题标题】:How to copy CSV data to an existing xlsx file using Python如何使用 Python 将 CSV 数据复制到现有的 xlsx 文件
【发布时间】:2015-04-24 12:33:44
【问题描述】:

我正在使用 Python 3.4,并且正在编写一个简短的脚本。我有一个可执行文件,它接受软件的输出并输出一堆带有请求数据的 csv 文件。我创建了一个 Excel (xlsx) 文件作为模板。它有一个针对特定要求量身定制的图表。

我想在每个 csv 文件中获取一定范围的数据,然后将它们输入到我已经创建的现有 excel 模板中,并用唯一的文件名保存它。本质上是迭代这个过程。

每个 csv 文件都有一个唯一的名称。我的目标是帮助自动创建图表。有时这最终可能是 100 多个图表。我已经搜索了很多关于如何在几乎没有帮助的情况下做到这一点。

我再次启动脚本,它会遍历每个 csv 文件(无论是 5 个还是 500 个),然后复制数据(始终在相同单元格中的某个范围),然后将其粘贴到模板 xlsx 文件中我已经创建并使用与 csv 类似的名称保存它,除了它将具有 .xlsx 作为扩展名。

我不知道这是否是最好的方法,或者我是否应该创建一个 csv 模板来代替它将复制到。

非常感谢任何帮助,谢谢。

【问题讨论】:

  • 你打算用什么来读/写 xlsx?
  • 我以前用过xlrd这个模块。
  • 我试过了,但没有太大帮助。我打算使用那些 excel 模块 xlsxwrt,我相信。

标签: python excel csv export


【解决方案1】:

第一种方法

如果您的最终目标是从 csv 中可用的数据生成图形,那么您可以使用 csvReader 读取数据并使用 matplotlib 绘制图形。

简单示例:

Sample csv file:
1,10,45
2,20,30
3,30,90
4,40,80

import csv
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

keys = ['Col1','Col2','Col3']
col1 = []
col2 = []
col3 = []
fd = open('sample.csv','r')
reader = csv.DictReader(fd,fieldnames=keys)
for row in reader:
    col1.append(int(row['Col1']))
    col2.append(int(row['Col2']))
    col3.append(int(row['Col3']))

pp = PdfPages("Sample.pdf")

plt.title("Col1 Vs Col2")
plt.xlabel("X-Values")
plt.ylabel("Y-Values")
plt.plot(col1,col2,label="Label 1",marker = "*")
legend = plt.legend(loc='best', shadow=True, fontsize=6)
legend.get_frame().set_facecolor('#00FFCC')
plt.grid(True)
plt.savefig(pp,format='pdf')
plt.clf()

plt.title("Col1 Vs Col3")
plt.xlabel("X-Values")
plt.ylabel("Y-Values")
plt.plot(col1,col3,label="Lable 2",marker = "*")
legend = plt.legend(loc='best', shadow=True, fontsize=6)
legend.get_frame().set_facecolor('#00FFCC')
plt.grid(True)
plt.savefig(pp,format='pdf')
plt.clf()
pp.close()

参考资料:

第二种方法

您可以使用xlrd、xlwt和xlutils对excel文件进​​行操作

使用 csvReader 读取数据,使用 xlutils 复制现有模板,编辑并再次保存

参考:

【讨论】:

  • 这很好,但问题是我需要将 CSV 文件的某个数据范围(只是数字)粘贴到已创建绘图的现有 Excel 文件中。我认为只提取 CSV 数据范围并将它们粘贴到我的 Excel 模板中会更容易。那可能吗?谢谢
【解决方案2】:

您可以使用glob 模块获取所有文件:

   import glob
   csv_file_list = glob.glob('*.csv')
   for fyle in csv_file_list:
       data = read_csv(fyle)
       write_to_excel(data)

您的 read_csv() 函数应该接受一个 CSV 文件并使用数据创建一个数组(矩阵)。通常使用 csv 模块(在 Python 3 中不需要 unicodecsv 'add-on')。

如果数据只是数字并且您不必担心带引号的字段,那么只读取行会快得多。所以你的 read_csv() 函数看起来像这样:

with open(fyle,'rb') as input:
    data = input.readlines().split(delim)
return data

然后您的write_to_excel() 函数将接受“数据”并写入您的模板。

【讨论】:

  • 这看起来不错,但我想将从 CSV 读取的数据粘贴回我现有 Excel 模板的某个范围内。此外,前 5 行是带引号的字段,但我不需要它们。前 5 行是始终创建但不需要传输到我的模板的文本。如何确保从 CSV 获得第 6 行及以上(全是数字)以粘贴到现有 Excel 模板的某个部分?希望这是有道理的。谢谢。
  • philshem write_to_excel() 函数会是什么样子?我想确保我知道如何写入我创建的现有 Excel 模板。
  • @duranil 有很多选项,但可能类似于thisthisthis
猜你喜欢
  • 2016-04-15
  • 2020-04-15
  • 2016-12-30
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多