【问题标题】:Write csv to excel with pandas用 pandas 编写 csv 到 excel
【发布时间】:2018-02-20 17:18:31
【问题描述】:

我在一个名为 data 的文件夹中有 13 个 csv 文件,我想按数字顺序 (1.csv,2.csv ...13.csv) 将该 csv 文件导出到一个名为 ( 1,2,3,4,5...13)。我尝试过这样的事情:

from pandas.io.excel import ExcelWriter
import pandas

ordered_files = ['1.csv', '2.csv','3.csv','4.csv', '5.csv','6.csv','7.csv', '8.csv','9.csv','10.csv', '11.csv','12.csv','13.csv']

with ExcelWriter('my_excel.xlsx') as ew:
    for csv_file in ordered_files:
        pandas.read_csv(csv_file).to_excel(
                        ew, index = False, sheet_name=csv_file, encoding='utf-8')

我有两个问题:

  1. 正如您在我的列表中看到的,我无法直接从我的文件夹数据中导入文件,如果我会尝试的话:

    ordered_files = ['data/1.csv'] 找不到有效的 csv。

  2. 如果我使用该列表方法,例如,我的工作表将命名为 3.csv 而不仅仅是 3。

一个附带问题,来自 csv 我看到一些列应该是 int 数字,格式为前面带有 ' 的字符串。

非常感谢您的宝贵时间!我用python 3!

【问题讨论】:

  • 您使用的是 Windows 还是 Unix?路径分隔符可能不同,您可能要使用 os.path.join (os.path.join("data","csv.1"))
  • IndexError: 至少一张纸必须是可见的

标签: python excel python-3.x pandas csv


【解决方案1】:

对于导入文件,路径是相对于当前工作目录的,如果使用绝对路径应该可以工作(如windows中的“C:\data\1.csv”,“/home/user/data/ 1.csv”在 Linux 或 Unix 环境中)。

要从工作表名称中删除扩展名,请列出不带 .csv 的文件名(例如 orderedlist = range(1:13) ),然后:

pandas.read_csv(<directory> + str(csv_file) + '.csv').to_excel(

可能是:

pandas.read_csv(/home/user/data/ + str(csv_file) + '.csv').to_excel(

或者,保持列表不变并将工作表名称更改为

sheet_name=csv_file.split('.')[0] 

只返回 '.' 之前的 csv_file 部分.

【讨论】:

  • 另外一点与问题无关,但使用 ordered_list = os.listdir(os.getcwd()) 将为您提供当前工作目录中的文件列表(os.getcwd () 会告诉你你在哪个目录)。
  • 您好 Tyler,您的回复很有帮助,我使用了 ordered_list = os.listdir(path) 其中 path 是我的数据文件夹位置,我最终得到了这个 ['4.csv', '8.csv ', '12.csv', '5.csv', '13.csv', '7.csv', '9.csv', '11.csv', '2.csv', '6.csv', '10.csv', '1.csv', '3.csv'] 但这是无序的,我可以以某种方式订购吗?
  • 不幸的是,它不会很好地工作,但是您可以在生成列表后使用ordered_files.sort(),但是输出将是:['1.csv', '10.csv', '11.csv'、'12.csv'、'13.csv'、'2.csv'、'3.csv'、'4.csv'、'5.csv'、'6.csv'、'7 .csv', '8.csv', '9.csv'] 因为文件名被视为字符串,而不是编号项目。
  • 我设法将其排序如下:a = sorted(ordered_list, key = lambda x: int(x.split(".")[0]))
  • 太棒了。我总是忘记使用 lambda。排序问题的出色解决方案。
【解决方案2】:

关于您的第一个问题,您可以编写如下相对路径:
"data/1.csv"'data//1.csv'

关于你的第二点,你的工作表是这样命名的,因为你正在循环你的 csv 名称,你用于工作表名称的值是:'1.csv',...
在我看来,你应该改写这个:


    from pandas.io.excel import ExcelWriter
    import pandas

    ext = '.csv'
    n_files = 13

    with ExcelWriter('data//my_excel.xlsx') as ew:
        for i in range(1,n_files+1):
            pandas.read_csv('data//'+str(i)+ext)
                  .to_excel(ew, index = False, sheet_name=str(i), encoding='utf-8')

因为你有 13 个文件,从 1 到 13,你应该在这个文件上循环,感谢range(1,n_files+1),range 函数会生成一个从 1 开始的 n_files 个整数列表。

希望对你有帮助。

【讨论】:

    【解决方案3】:

    如果您只关心从工作表名称中删除最后四个字符,只需在调用 to_excel 时使用 sheet_name=csv_file[:-4]。 @pazqo 的评论向您展示了如何生成正确的路径以在 data 目录中查找 CSV 文件。

    更一般地说,假设您想处理给定路径上的所有 CSV 文件,有几种方法可以做到这一点。这是一种简单的方法。

    import os
    from glob import glob
    
    def process(path, ew):
        os.chdir(path) # note this is a process-wide change
        for csv_file in glob('*.csv'):
            pandas.read_csv(csv_file).to_excel(ew,
                                               index = False,
                                               sheet_name=csv_file[:-4],
                                               encoding='utf-8')
    
    with ExcelWriter('my_excel.xlsx') as ew:
        process("data", ew)
    

    您也可以考虑使用 glob(os.path.join(path, "*.csv")) 生成文件名,但这也需要您从工作表名称中删除前导路径 - 可能值得避免使用 os.chdir 调用,这有点难看。

    【讨论】:

    • 我只想补充一点,"1.csv".rpartition(".")[0] 更安全,因为它只会删除扩展名。更好的是,使用os.path.splitext("1.csv")[0]
    • csv 表命名已解决,但如何将 os.path.join 传递给我的列表?而且我不能把那个文件夹中的所有 csv 文件都拿走吗?我将只存储 13 个 csv,所以我可以一次将它们全部拿走吗?
    • @pazquo 在一般意义上“更安全”,也许,而且肯定更优雅。但是在向初学者解释时,使用".csv" 的特定扩展名可能有点矫枉过正。
    猜你喜欢
    • 2018-06-11
    • 2017-11-21
    • 2018-08-04
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2021-09-24
    • 2018-12-07
    相关资源
    最近更新 更多