鱼C论坛

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

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

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

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

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

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

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

number=0
for root, dirs, files in os.walk(".",topdown=True):
        for filename in files:
        
                li=os.path.splitext(filename) #分割文件名得到列表[文件名,扩展名]
                if  li[1]=='.txt':
                        name=li[0]          
                        filelocation=os.path.join(root,filename) #原文件的地址
                        newfilelocation=os.path.join(root,"list.txt")
            
                        with open(filelocation,'r',encoding='utf-8')as file_object,codecs.open(newfilelocation,'w','utf-8')as newfile: 
                                lines=file_object.readlines() #读取全部内容
                                LastLine=lines[-1]
                                datalist=LastLine.split() #分割数据,生成列表
                                        
                                data1=filename
                                data2=datalist[0]
                                                
                                newline=str(data1)+str(data2)+'\n'                          
                                        
                                                       
                                newfile.write(newline)
                                                
                        number=number+1
                        
                
print("共%s个文件"%number)
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 | 显示全部楼层
# -*- coding: utf-8 -*-
import os
import shutil
import codecs

number=0
for root, dirs, files in os.walk(".",topdown=True):
        for filename in files:
        
                li=os.path.splitext(filename) #分割文件名得到列表[文件名,扩展名]
                print(li)
                if  li[1]=='.txt':
                        name=li[0]          
                        filelocation=os.path.join(root,filename) #原文件的地址
                        newfilelocation=os.path.join(root,"list.txt")
            
                        with open(filelocation,'r',encoding='utf-8')as file_object,codecs.open(newfilelocation,'w','utf-8')as newfile:
                                lines=file_object.read() #读取全部内容                                
                                if lines.strip() !='': #是否为空
                                        LastLine=lines[-1]
                                        datalist=LastLine.split() #分割数据,生成列表
                                                
                                        data1=filename
                                        data2=datalist[0]
                                                        
                                        newline=str(data1)+str(data2)+'\n'                          
                                                
                                                               
                                        newfile.write(newline)
                                                
                        number=number+1
                        
                
print("共%s个文件"%number)
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-6-10 14:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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