总结
豆包 AI 助手文章总结

如何利用python读取特定目录下的特定文件的倒数两行?

php中文网
发布: 2016-06-06 16:22:40
原创
2740人浏览过

本人刚接触python,在书上看到一个习题,问题如下:
1、列出指定目录”c:\”所有的后缀名为*.txt 的文件(包括子文件夹内所有文件),并输出每个文件的创建日期和大小
2、针对上述文件,取内容倒数 2 行,存入新文件,取名“list.txt”
3、将上述文件按照创建时间进行正向排序(从小到大),存入新文件,取名“排序.txt”
我尝试做了一下,但是有几个地方总是做到一半就没思路了,求助各位!

<span class="kn">import</span> <span class="nn">os</span>  
<span class="k">for</span> <span class="n">parent</span><span class="p">,</span><span class="n">dirnames</span><span class="p">,</span><span class="n">filenames</span> <span class="ow">in</span> <span class="n">os</span><span class="o">.</span><span class="n">walk</span><span class="p">(</span><span class="s">'C:'</span><span class="p">):</span>   <span class="c">#遍历C:下的文件  </span>
<span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">filenames</span><span class="p">:</span>   <span class="c">#循环文件列表  </span>
  <span class="k">if</span> <span class="s">".txt"</span> <span class="ow">in</span> <span class="n">filename</span><span class="p">:</span>       <span class="c">#找出所以后缀是.txt的文件  </span>
    <span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span><span class="n">filename</span><span class="p">))</span>   <span class="c">#得到该文件的绝对路径并打开文件  </span>
    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">myfile</span><span class="o">.</span><span class="n">readlines</span><span class="p">():</span>     <span class="c">#读取文件每一行,并循环  </span>
      <span class="nb">open</span><span class="p">(</span><span class="s">'./list.txt'</span><span class="p">,</span><span class="s">'a'</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>   <span class="c">#将该行写入指定名称为'list.txt'的文件中去</span>
登录后复制

回复内容:

读取最后2行,别信那些用readlines()的答案。那些答案,丢给你个16GB的文件就死翘翘了。老老实实用tail命令的实现方法:

  1. 用os.seek跳转到文件末尾,os.tell判断文件大小
  2. 设置个合适的buf size,假设是1024。循环从文件末尾os.seek往回跳buf size,判断读取的内容里回车符的数量,累加回车符数量
  3. 当回车符数量大于等于2的时候,停止循环。确定倒数第二个回车符的位置,os.seek到那个位置,输出到文件末尾

这个实现还是有坑。如果文件一直在增长,那么『最后两行』应该是程序执行当时文件的最后两行,步骤3里应该是『从倒数第二个回车符输出到步骤1中获取的文件大小位置』

1. 使用os.walk遍历所有的文件。
2. 使用os.path.splitext获取每个文件的扩展名。筛选出扩展名是txt的文件。
3. 将上一步的结果组成一个list,按照时间排序。
4. 取出list的后2个元素。
5. 写入list.txt。 给你来个 shell 版的,

ls -1tr `find . -name "*.txt" -type f -print` | tee 排序.txt.xx | xargs -I FNAME tail -n 2 FNAME >> list.txt.xx && mv list.txt.xx list.txt && mv 排序.txt.xx 排序.txt

擦,回头一看发现是 windows,,, 谢邀。

别想太多,一步一步慢慢来。
  1. 你已经知道怎么遍历文件了,但是后缀名为 '.txt' 不应该用 in 来判断,而要用 filename.endswith('.txt') 或 filename[-4:] == '.txt'。
    在 Windows 平台上,文件的创建时间可以用 os.path.getctime() 来获取。os.path.getsize() 则能获得文件大小。
  2. 要获取文件内容的最后两行,myfile.readlines() 会返回一个 list,所以 myfile.readlines()[-2:] 就是最后两行了。
    如果文件比较大的话,读取完整的文件肯定是不高效的。这时可以用 seek() 方法读后面的内容。
  3. 根据第 1 步得到的信息可以生成 [(path0, time0), (path1, time1), ...] 的 list。
    然后调用它的 sort() 方法,以第二个元素排序即可。
可以用deque

def tail(filename, n=10):
    'Return the last n lines of a file'
    return deque(open(filename), n)
登录后复制
python速学教程(入门到精通)
python速学教程(入门到精通)

python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号