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

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

WBOY
WBOYOriginal
2016-06-06 16:22:402521browse

本人刚接触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

<code class="language-text">def tail(filename, n=10):
    'Return the last n lines of a file'
    return deque(open(filename), n)
</code>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn