知行编程网知行编程网  2022-02-27 06:00 知行编程网 隐藏边栏 |   抢沙发  5 
文章评分 0 次,平均分 0.0

文件这块知识已经讲了好几篇,

  • 第一篇是2个小例子入门
  • 第二篇是文件语法和场景的一个总览
  • 第三篇是一个综合小例子实战一下,可以融合前面所学的知识
  • 这一篇算是收尾吧,回忆我以前写过的python程序,我觉得python文件处理有这么几个模块非常重要,但是一般没有人告诉你,学会这几招后,让你的工作会更方便更实用一些.

其实我最开始学的时候压根没有人告诉我这几招,后来工作中写代码多了,看了一些别人的开源代码,才发现哇有这么好的模块,真是相见恨晚啊!!

所以分享给大家,可以让初学者少走弯路.也许哪一天你工作中用到这块,可以翻开我的文章看一下~~

 

 

1.如何对多个文件中的内容替换

假设在当前目录下有2个文件 test01.txt,test02.txt

我们需要把里面的Java全部替换为Python,一次搞定怎么做呢?

|--test01.txt---

Hi All,

What Is Java?

What Is Programming?

 

|--test02.txt---

Hi All,

Why do people use Java?

It’s an important tool to learn

Python标准库里面有一个很强大的模块fileinput ,fileinput 模块允许你循环一个或多个文本文件的内容,非常实用

#!/usr/bin/env python

import fileinput

import glob

#利用glob模块过滤出当前目录下所有的txt文件

#inplace=1 标准输出,比如print会被重定向到打开文件

#把每一行去掉回车,然后把java替换为Python

for line in fileinput.input(glob.glob('*.txt'),inplace=1):

print line.strip().replace('Java','Python')

fileinput.close()#关闭文件句柄

 

>>

|--test01.txt---

Hi All,

What Is Python?

What Is Programming?

 

|--test02.txt---

Hi All,

Why do people use Python?

it’s an important tool to learn

 

是不是很方便,假如你在批处理邮件,有1000封邮件,你希望把里面的标题改掉,这招是不是很爽.

2.如何列出全目录结构

有的时候我们想列出当前目录下所有文件和子目录,有没有直接的方法

不需要用递归去处理,有python内置的os.walk()函数,一招搞定,是不是很贴心

 

假如我们有这样的一个目录结构为'C:myPython',结构如下:

|---demo---

|--demo_01.exe    

|--demo_02.msi    

|--other

|--info.docc  

 

|---log-----

|--1110_log.txt  

|--1111_log.txt  

|--1112_log.txt  

|---pic-----

|--0127_1.jpg    

|--0127_2.jpg    

|--0127_3.jpg    

 

#!/usr/bin/env python

import os

path=r'C:myPython'

for folderName,subfolders,filenames in os.walk(path):

print 'The current folder is :'+folderName

 

for subfolder in subfolders:#列出子目录

print ('Subfolder of '+folderName+': '+subfolder)

for file_name in filenames:#列出文件

print ('File insdie '+folderName+': '+file_name)

 

>>

 

The current folder is :C:myPython

Subfolder of C:myPython: demo

Subfolder of C:myPython: log

Subfolder of C:myPython: pic

The current folder is :C:myPythondemo

Subfolder of C:myPythondemo: other

File insdie C:myPythondemo: demo_01.exe

File insdie C:myPythondemo: demo_02.msi

The current folder is :C:myPythondemoother

File insdie C:myPythondemoother: info.docx

The current folder is :C:myPythonlog

File insdie C:myPythonlog: 1110_log.txt

File insdie C:myPythonlog: 1111_log.txt

File insdie C:myPythonlog: 1112_log.txt

The current folder is :C:myPythonpic

File insdie C:myPythonpic: 0127_1.jpg

File insdie C:myPythonpic: 0127_2.jpg

File insdie C:myPythonpic: 0127_3.jpg


3.如何把多个文件copy到另外一个目录下

有的时候我们需要把一个或者多个文件备份到另外一个目录下,有没有啥办法,简单快捷搞定.有的,python提供了一个高级文件模块叫shutil,可以轻松搞定.

 

 

假如我们当前目录下有这样一个文件结构:

|---backup---

|--abc.txt

|---test01.txt---

|---test02.txt---

 

问题:

我们想把test01.txt和text02.txt备份到backup下,怎么办

解决:

5行代码搞定

 

#!/usr/bin/env python

#列出所有的文件

#过滤出txt文件

#copy到backup下

import shutil,os

for file in os.listdir('.'):

if os.path.splitext(file)[1]=='.txt':

shutil.copy(file,os.path.join('backup',file))

 

也许有同学说怎么拷贝目录,也有现成的模块

shutil.copytree('backup', 'backup2')

创建了backup2目录,然后把backup下的文件全部都copy过来

 

4.删除目录以及所有子目录的文件

很多时候特别是我们要清空一个目录的时候,若这个目录下面有文件,或者不为空,直接用os.rmdir('backup2'),会报错,告诉你:The directory is not empty: 'backup2'

捉急啊,怎么办呢:

shutil.rmtree('backup2')backup2目录就全部删掉了

 

 

细心的同学会发现我的源码上面为啥要加上"#!/usr/bin/env python",因为我的源码都是在win编译执行的,有同学反映这样在linux,mac上运行会报错,确实会有这个问题:

  • 很多小白刚开始学的时候,都会原封不动的把源码拿过来执行(我当时学的时候也是这样的)也许老鸟或者有经验的同学一看,哦这个问题啊,原来是没有引入python解释器的路径
  • 但是对新手来说,可能会花很多时间去debug,去查找问题.
  • 所以我决定宁可我麻烦一点,每一段都加上这个头,也要保证新手能准确无误的运行我的代码,有的时候确实要换位思考一下小白用户的感受.也许你多花几秒钟多写几行,却可以帮助新手,帮助别人节省好多时间,少走很多弯路.

 


好了文件扩展模块小技巧就讲到这里啦,希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享