找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 236|回复: 8

[求助] python如何批量读取txt文档然后写入到excel中去

1

主题

4

帖子

4

积分

贫民

积分
4
奔跑的公牛 发表于 2018-11-25 21:11:05 | 显示全部楼层 |阅读模式
各位大神好:
        我才接触python不到三个月,目前已经把《Python编程从入门到实践》(著Eric Matthes,袁国忠翻译)学完了,学习了如何利用 with.....open(filename)...as来读取和写txt文档,json.load()和json.dump()读取和写json格式的文件。
       但是,我现在有一个问题,我有15个文件夹(见图1),每个文件夹有24个txt文档(见图2),命名都很有规律,每个txt文当中有四列和几千行数字(见图3),现在我想用python来读取这些txt,并且把每个文件夹中的第一个txt的第四列写到excel1里面去,把每个文件夹的第二个txt的第四列写到excel2中去,把每个文件夹的的第三个txt的第四列写到excel3中去,.........以此类推,就应该可以得到24个excel。
      我可能表述的不太清楚,有大神想要指导下小弟的话,可以联系我企鹅850756306,不胜感激。
      因为总文件大小有一百多兆,放不上来,我就放几张截图。


图1:15个文件夹

图1:15个文件夹

图2:每个文件夹中24个txt

图2:每个文件夹中24个txt

图3:每个txt中有4列若干行

图3:每个txt中有4列若干行
回复

使用道具 举报

0

主题

7

帖子

7

积分

贫民

积分
7
ryan 发表于 2018-11-26 16:19:18 | 显示全部楼层
# 针对你的问题,这里提供如下思路和代码:
# 1. 思路
    1. 第一步,将所有文件夹下的txt文件合并到一起
    # # 这里需要注意的是,由于后面要分成24个excel,因此,我们把路径和文件名也作为两个新的字段添加进来
    2. 第二步,将文件拆开并输出到excel中
# 2. 代码如下
  1. import pandas as pd
  2. import os
  3. import glob

  4. def union_files(path):
  5.     df = pd.DataFrame()
  6.     # 第一层,获取所有文件夹
  7.     for dirs in os.listdir(path):
  8.         dirpath = os.path.join(path,dirs)
  9.     # 第二层,获取文件夹下的文件名
  10.         for file in glob.glob(os.path.join(dirpath,'*.txt')):
  11.             temp = pd.read_csv(file,sep='\t',header=None,encoding='utf-8',prefix='V')# 这里假设你的文件分隔符为tab,编码方式为utf-8
  12.             temp['file'] = file # 添加一个路径用作后面的拆分
  13.             df = df.append(temp)
  14.             print(file,df.shape,temp.shape)
  15.     print('文件合并完成!')
  16.     return df
  17. def sp_df(df):
  18.     df['file'] = df['file'].map(lambda x:str(x).split('\\')[-1])# 获取到文件名
  19.     df['file'] = df['file'].map(lambda x:str(x).split('-')[-3]) # 根据文件名中的00,01,02···23来拆分文件
  20.     for index,i in enumerate(df['file'].unique()):
  21.         temp = df[df['file']==i].drop('file',1)
  22.         temp.to_excel(os.path.join(path,'{}.xlsx'.format(i)),index=False)
  23.         print('开始写出excel文件,目前进度为{}/24'.format(index+1))
  24.     print('All Done!')

  25. if __name__ == '__main__':
  26.     path = r'D:\PycharmProjects' # 这里替换为你的文件路径,注意路径中不要有中文
  27.     df = union_files(path)
  28.     sp_df(df)
复制代码
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
奔跑的公牛  楼主| 发表于 2018-11-27 15:33:33 | 显示全部楼层
ryan 发表于 2018-11-26 16:19
# 针对你的问题,这里提供如下思路和代码:
# 1. 思路
    1. 第一步,将所有文件夹下的txt文件合并到一起

哇塞,  大神非常厉害,我复制了你的代码,改了路径,没有报错,直接就可以运行。
但是,可能是我前面没有表达清楚,大神代码输出的结果每个excel里面是竖着重叠的,其实我想要的是在不同列。举个例子:第一个txt的第四列数据放在excel的第一列,第二个txt的第四列数据放在excel的第二列,第三个txt的第四列数据放在excel第三列。
我要去好好研究下大神的代码,好多地方看不懂,可不可以添加一些注释啊
在此跪谢
回复 支持 反对

使用道具 举报

0

主题

7

帖子

7

积分

贫民

积分
7
ryan 发表于 2018-11-27 22:05:37 | 显示全部楼层
首先,假设你的所有txt文件都是4列,且前3列都是一样的,差别仅在于第4列。
根据你的表述,我对你的需求理解如下:
1. 15个文件夹,每个文件夹下的txt合并到一个文件中。
2. 1中表述的合并到一起的文件输出字段如下:
  1. 第1个字段|第2个字段|第3个字段|第1个txt的第4个字段|第2个txt的第4个字段|第3个txt的第4个字段|···|第24个txt的第4个字段
复制代码

基于以上假设和对你需求的理解,代码部分修改如下,你同样需要修改文件路径即可:
  1. import pandas as pd
  2. import os
  3. import glob

  4. def union_sp_files(path):
  5.     # 第一层,获取所有文件夹
  6.     for dirs in os.listdir(path):
  7.         dirpath = os.path.join(path,dirs)
  8.         # 第二层,获取文件夹下的文件名
  9.         df = pd.DataFrame()
  10.         for index,file in enumerate(glob.glob(os.path.join(dirpath,'*.txt'))):
  11.             temp = pd.read_csv(file,sep='\t',header=None,encoding='utf-8',prefix='V')# 这里假设你的文件分隔符为tab,编码方式为utf-8
  12.             temp['file'] = file # 添加一个路径用作后面的拆分
  13.             df = df.append(temp)
  14.             print(file,df.shape,temp.shape)
  15.         df['file'] = df['file'].map(lambda x:str(x).split('\\')[-1])# 获取到文件名
  16.         df['file'] = df['file'].map(lambda x:str(x).split('-')[-3]) # 根据文件名中的00,01,02···23来拆分文件
  17.         print('{}文件夹下的文件合并完成!'.format(dirpath))
  18.         df = df.pivot_table(index=['V0','V1','V2'],columns=['file'],values=['V3']).reset_index()
  19.         df.to_excel(os.path.join(path,'{}.xlsx'.format(index+1)),index=False)
  20.         print('开始写出excel文件,目前进度为{}/24'.format(index+1))
  21.     print('All Done!')  
  22. if __name__ == '__main__':
  23.     path = r'D:\PycharmProjects' # 这里替换为你的文件路径,注意路径中不要有中文
  24.     union_sp_files(path)
复制代码
回复 支持 反对

使用道具 举报

0

主题

7

帖子

7

积分

贫民

积分
7
ryan 发表于 2018-11-27 22:09:36 | 显示全部楼层
奔跑的公牛 发表于 2018-11-27 15:33
哇塞,  大神非常厉害,我复制了你的代码,改了路径,没有报错,直接就可以运行。
但是,可能是我前面没 ...

代码没什么难的,就是通过循环从文件夹->文件,一个个读入,然后再拆分。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
奔跑的公牛  楼主| 发表于 2018-11-28 11:22:33 | 显示全部楼层
ryan 发表于 2018-11-27 22:05
首先,假设你的所有txt文件都是4列,且前3列都是一样的,差别仅在于第4列。
根据你的表述,我对你的需求理 ...

您好:
      所有的 txt确实是前三列相同,差别只是在第四列。运行了您写的代码,报错说关键字V3错误,如图。
1.png
回复 支持 反对

使用道具 举报

0

主题

7

帖子

7

积分

贫民

积分
7
ryan 发表于 2018-11-28 23:21:02 | 显示全部楼层
你的文件只有两列啊,是不是分隔符的问题,你分隔符只分成了两列。
回复 支持 反对

使用道具 举报

1

主题

4

帖子

4

积分

贫民

积分
4
奔跑的公牛  楼主| 发表于 2018-11-29 15:59:35 | 显示全部楼层
ryan 发表于 2018-11-28 23:21
你的文件只有两列啊,是不是分隔符的问题,你分隔符只分成了两列。

您说的是txt里面的分隔符吗,我感觉列与列之间应该就是空格啊,我把其中一个txt上传您看一下

2018-01-02-00-00-00.txt

417.22 KB, 下载次数: 1

回复 支持 反对

使用道具 举报

0

主题

7

帖子

7

积分

贫民

积分
7
ryan 发表于 2018-11-30 01:35:13 | 显示全部楼层
奔跑的公牛 发表于 2018-11-29 15:59
您说的是txt里面的分隔符吗,我感觉列与列之间应该就是空格啊,我把其中一个txt上传您看一下
...

你的文件是以空格分隔的,我以为是用\t呢。你把代码这样改一下:
把这段
  1. temp = pd.read_csv(file,sep='\t',header=None,encoding='utf-8',prefix='V')# 这里假设你的文件分隔符为tab,编码方式为utf-8
复制代码

改成
  1. temp = pd.read_csv(file,sep=' ',header=None,encoding='utf-8',prefix='V')# 这里假设你的文件分隔符为tab,编码方式为utf-8
复制代码

应该就可以了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表