鱼C论坛

 找回密码
 立即注册
查看: 2044|回复: 10

[已解决]如何提取txt文件最后一行第一个数据?

[复制链接]
发表于 2017-9-1 09:15:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 meiszp 于 2017-9-1 09:20 编辑

提取当前目录下所有txt文件最后一行第一个数据,将txt文件名和提取的数据写入list.txt,第一列文件名,第二列数据。
如下代码报错,求指正,谢谢!
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import shutil
  4. import codecs

  5. number=0
  6. for root, dirs, files in os.walk(".",topdown=True):
  7.         for filename in files:
  8.         
  9.                 li=os.path.splitext(filename) #分割文件名得到列表[文件名,扩展名]
  10.                 if  li[1]=='.txt':
  11.                         name=li[0]         
  12.                         filelocation=os.path.join(root,filename) #原文件的地址
  13.                         newfilelocation=os.path.join(root,"list.txt")
  14.             
  15.                         with open(filelocation,'r',encoding='utf-8')as file_object,codecs.open(newfilelocation,'w','utf-8')as newfile:
  16.                                 lines=file_object.readlines() #读取全部内容
  17.                                 LastLine=lines[-1]
  18.                                 datalist=LastLine.split() #分割数据,生成列表
  19.                                        
  20.                                 data1=filename
  21.                                 data2=datalist[0]
  22.                                                
  23.                                 newline=str(data1)+str(data2)+'\n'                          
  24.                                        
  25.                                                        
  26.                                 newfile.write(newline)
  27.                                                 
  28.                         number=number+1
  29.                        
  30.                
  31. print("共%s个文件"%number)
  32. input()       
复制代码


错误提示:
Traceback (most recent call last):
  File "C:/Users/lenovo/Desktop/test/1.py", line 18, in <module>
    LastLine=lines[-1]
IndexError: list index out of range
最佳答案
2017-9-2 10:30:26
原代码中第16行,打开newfile时用了参数'w'是错误的,会导致你每次重写该文件,以至于无论目录下有多少txt文件,你只会写最后读到的一个txt文件的名称和数据。并且list.txt本身也是txt文件,所以,当读到这个list.txt文件的时候,你的file_object(同样是代码16行)是list.txt的上个版本,而紧接着又要newfile清空并重写这个list.txt文件。这会导致必然读到一个空文件。那么LastLine = lines[-1]必会报错,也就是你现在的错误原因。

修改办法:
1.保证之前的txt文件没有空的情况下只要把'w'改成'a'即可。
2.若不能保证之前的txt文件都不为空,则请加条件判断或者try块避免报错。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-1 09:22:06 | 显示全部楼层
代码没问题 能跑 应该是哪儿使用错了 自己检查一下

py文件的当前路径是否有 文件目录

比如:
data:
        1.txt
        2.txt
       3.txt
      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-1 09:37:11 | 显示全部楼层
、尾指一勾 发表于 2017-9-1 09:22
代码没问题 能跑 应该是哪儿使用错了 自己检查一下

py文件的当前路径是否有 文件目录

当前目录下有文件
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 09:50:57 | 显示全部楼层
2017-09-01_094857.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-1 10:21:50 | 显示全部楼层

恕我愚笨,新手没看明白怎么改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 10:27:19 | 显示全部楼层
meiszp 发表于 2017-9-1 10:21
恕我愚笨,新手没看明白怎么改

不是读取全部内容吗?????

用你的说法readlines 换成 read
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-1 11:04:35 | 显示全部楼层
ba21 发表于 2017-9-1 10:27
不是读取全部内容吗?????

用你的说法readlines 换成 read

一样的错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 12:36:16 | 显示全部楼层
看样子你的txt文件里有一个是空文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 14:36:46 | 显示全部楼层

你把你的txt 文件装进一个 文件夹里面 比如:data 目录
代码改成这样:
for root, dirs, files in os.walk("./data",topdown=True):

要不就是你的某一个文件是空的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-1 14:45:18 | 显示全部楼层
  1. # -*- coding: utf-8 -*-
  2. import os
  3. import shutil
  4. import codecs

  5. number=0
  6. for root, dirs, files in os.walk(".",topdown=True):
  7.         for filename in files:
  8.         
  9.                 li=os.path.splitext(filename) #分割文件名得到列表[文件名,扩展名]
  10.                 print(li)
  11.                 if  li[1]=='.txt':
  12.                         name=li[0]         
  13.                         filelocation=os.path.join(root,filename) #原文件的地址
  14.                         newfilelocation=os.path.join(root,"list.txt")
  15.             
  16.                         with open(filelocation,'r',encoding='utf-8')as file_object,codecs.open(newfilelocation,'w','utf-8')as newfile:
  17.                                 lines=file_object.read() #读取全部内容                                
  18.                                 if lines.strip() !='': #是否为空
  19.                                         LastLine=lines[-1]
  20.                                         datalist=LastLine.split() #分割数据,生成列表
  21.                                                 
  22.                                         data1=filename
  23.                                         data2=datalist[0]
  24.                                                         
  25.                                         newline=str(data1)+str(data2)+'\n'                          
  26.                                                 
  27.                                                                
  28.                                         newfile.write(newline)
  29.                                                 
  30.                         number=number+1
  31.                         
  32.                
  33. print("共%s个文件"%number)
  34. input()        
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-2 10:30:26 | 显示全部楼层    本楼为最佳答案   
原代码中第16行,打开newfile时用了参数'w'是错误的,会导致你每次重写该文件,以至于无论目录下有多少txt文件,你只会写最后读到的一个txt文件的名称和数据。并且list.txt本身也是txt文件,所以,当读到这个list.txt文件的时候,你的file_object(同样是代码16行)是list.txt的上个版本,而紧接着又要newfile清空并重写这个list.txt文件。这会导致必然读到一个空文件。那么LastLine = lines[-1]必会报错,也就是你现在的错误原因。

修改办法:
1.保证之前的txt文件没有空的情况下只要把'w'改成'a'即可。
2.若不能保证之前的txt文件都不为空,则请加条件判断或者try块避免报错。

解决问题

解决问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-6 03:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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