本文目录一览:
- 1、Python其实很简单 第十六章 目录管理
- 2、Python其实很简单 第十五章 文件操作
- 3、如何使用Python获取文件所在目录和文件名
- 4、Python的os库的使用
- 5、R、python的文件夹操作
Python其实很简单 第十六章 目录管理
为实现“按名存取”,必须建立文件名与辅存空间中物理地址的对应关系,体现这种对应关系的数据结构称为文件目录。文件目录表目至少要包含文件名、文件的类型、文件的长度、访问权限、建立时间、访问时间和文件存储地址等内容。通过前面一章的介绍,我们已经知道在文件信息中已经包含了文件名、文件类型访问权限等信息,而存储地址的信息则包含在目录信息中。
16.1路径
路径通常用一个字符串来表示,可以按照路径信息定位到一个目录或文件。如:“C:UsersAdministratorPictures1.jpg”这个信息可以非常方便的找到这个图片文件,“C:UsersAdministratorPictures”这个信息可以帮助我们找到更多的图片文件。
这里所说的“路径”和上网时碰到的“地址”含义比较相似,互联网就相当于将个人电脑可以访问的范围扩大了,互联网中的地址也是对应某一个存储空间的路径,按照地址可以访问互联网上的信息,就如同按照路径可以找到计算机中的文件一样。
在Python中,可以导入 os模块 来进行目录操作。
1、获取当前工作目录getcwd()函数
例:
import os
print(os.getcwd())
运行结果:
C:UsersAdministratorAppDataLocalProgramsPythonPython38
这个路径是当前Python IDLE所在的地址。
2、获取文件的绝对路径abspath()函数
abspath()函数是os模块的子模块path提供的一个函数。用法举例如下:
import os
print(os.path.abspath(r'test.txt'))
运行结果:
C:UsersAdministratorAppDataLocalProgramsPythonPython38 est.txt
16.2 目录操作类函数
1、判断目录是否存在exists()函数
exists()函数是os模块的子模块path中的函数。使用方法举例如下:
import os
print(os.path.exists(r'C:UsersAdministratorPictures1.jpeg'))
输出结果:
True
2、创建目录mkdir()函数和makedirs()函数
mkdir()函数和makedirs()函数都是由os模块提供的,下面举例说明用法和区别。
例1:
import os
path='d:test'
if not os.path.exists(path):
os.makedirs(path)
print('该文件目录创建成功!')
如果目录d: est已存在,则不再创建;若不存在,则创建。
例2:
import os
path='d:testtest1test11'
if not os.path.exists(path):
os.makedirs(path)
print('该文件目录创建成功!')
虽然目录d: est已存在,但可以在其下继续创建子目录。上面的代码可以成功地创建d: est est1 est11目录。
mkdir()函数和makedirs()函数用法基本一样,不同之处在于mkdir()函数只能能创建一级目录。
3、删除目录函数rmdir()函数
rmdir()函数是由os模块提供的。
例如:通过上面的例子已经建立了d: est est1 est11目录,现在去删除子目录test11(此子目录为空目录),代码如下:
import os
os.rmdir('d:testtest1test11')
如果要删除的目录非空(其下还包含有文件或文件夹),则不能删除,并且出现Windows文件操作错误的提示(Python是调用操作系统命令完成文件和目录操作的)。譬如d: est目录下含有有子目录,则不能对其进行如下删除操作。
import os
os.rmdir('d:test')
此时,会出现如下错误提示:
Traceback (most recent call last):
File "C:/Users/zym/AppData/Local/Programs/Python/Python39/4.py", line 10, in
os.rmdir('d:test')
OSError: [WinError 145] 目录不是空的。: 'd:test'
4、删除非空目录函数rmtree()函数
rmtree()函数是由Python内置的标准模块shutil提供的,可以删除目录及目录下的文件和子目录。如删除d: est目录及其下的子目录和文件,可用如下代码:
import shutil
shutil.rmtree('d:test')
5、遍历目录walk()函数
walk()函数是由os模块提供的。
语法格式:
os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])
其中,top是所要遍历的目录的地址;topdown为可选参数,为 True时自上而下遍历 目录,为False时自下而上遍历目录,默认值为True;onerror为可选参数,用于指定异常处理方式,默认为忽略;followlinks为可选参数,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。
该函数的返回值为一个三元组(root,dirs,files)。root 所指的是当前正在遍历的这个文件夹的本身的地址;dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录);files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)。
例:遍历d: est目录及其子目录下的所有子目录和文件:
d: est目录及其下的子目录和文件
import os
path='d:test'
tups=os.walk(path) # 函数walk()的返回值为三元组
for root,dirs,files in tups: # 遍历这个三元组
for name in dirs: #遍历存放目录值的元组
print('dir:',os.path.join(root,name))
for name in files: #遍历存放文件名值的元组
print('file:',os.path.join(root,name))
运行结果如下:
dir: d: est est1
dir: d: est est1 est11
dir: d: est est1新建文件夹
file: d: est est1新建文本文档.txt
file: d: est est1 est11新建文本文档.txt
Python其实很简单 第十五章 文件操作
在各种变量中保存的数据都是临时的,随着程序运行结束都会丢失。要做到数据长期有效,必须建立在磁盘中建立文件,将数据输入到文件中并保存。需要获取数据时需要打开文件读取。
而我们自己建立的程序都是应用程序,从本质上讲,应用程序是无法直接操作计算机的硬件的,譬如读写磁盘中文件,这就需要调用操作系统中的相应命令。接下来我们使用的Python内置函数open()、write()都是通过调用操作系统的相关命令才实现文件读写的,至于其中的细节,我们就不需要考虑了。
15.1创建和打开文件
在Python 中创建或打开文件,实际上是建立一个对象,该对象通过调用内置的open()函数创建或打开一个文件。
语法:
file object = open(filename [, mode][, buffering])
参数说明如下:
filename:file_name变量是一个包含了你要访问的文件名称的字符串值;
mode:mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
Buffering:如果buffering的值被设为0,就不会有寄存;如果buffering的值取1,访问文件时会寄存行;如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小;如果取负值,寄存区的缓冲大小则为系统默认。
mode参数的参数值及说明
对于其中最难区别的r、r+、w、w+、a、a+几个参数的区别总结如下,要特别注意指针的位置:
下面举例说明open( )函数的使用方法。
例1:
file=open('1.py')
如果文件“1.py”存在,则可以打开此文件;如果文件“1.py”不存在,则会出现如下提示:
Traceback (most recent call last):
File " ", line 1, in
file=open('1.py')
FileNotFoundError: [Errno 2] No such file or directory: '1.py'
例2:
file=open('4.py',’a+’)
虽然文件“4.py”不存在,但运行并未出现错误,参见上表,“a+”的含义是以读写模式打开文件,如果该文件已经存在,新内容将以追加方式写入;如果该文件不存在,则新建文件用于写入。查看文件夹,发现已经生成了一个新的文件4.py。
例3:
file=open('python.png','rb')
print(file)
运行结果:
这就是说,虽然Python可以打开一个图片格式的文件,但print()并不能将其输出,还需要第三方库中模块的相应方法去处理,如PIL中的open()f方法。
例4:
file = open("f.txt", "w",encoding='utf-8')
# 以只写模式打开文件f.txt,编码方式为utf-8
print( "文件名: ", file.name) # 输出文件名
print( "是否已关闭 : ", file.closed) # 文件是否打开
print( "访问模式 : ", file.mode) # 文件访问模式
运行结果:
文件名: f.txt
是否已关闭 : False
访问模式 : w
例5:
15.2关闭文件
打开文件使用后要及时关闭,以免造成不必要的破坏,同时也可以释放内存。在Python中使用close()方法可以关闭文件。
语法格式:
file.close()
其中,file为文件对象。
15.3 with语句
with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
with语句的语法格式如下:
with expression as target:
with-body
其中,expression用于指定一个表达式,譬如打开文件的open()函数。target用于指定一个变量,并且将expression的结果保存到该变量中,譬如文件对象file。with-body用于指定with语句体,譬如一些文件操作的相关语句,如果没有要执行的语句体,则直接用pass语句代替。
假设python当前目录下存在一个test.txt文件,其内容如下:
Python是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
Python是交互式语言: 这意味着,您可以在一个 Python 提示符 后直接执行代码。
Python是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发。
举例如下:
with open('test.txt','r',encoding='utf-8') as file:
line=file.readline() # readline()方法可以读取文件一行数据,接下来就会讲到。
print(line)
运行结果如下:
Python是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
而此时,我们给该段代码with语句之外再增加一个读取文件的语句,代码如下:
with open('test.txt','r',encoding='utf-8') as file:
line=file.readline()
print(line)
line2=file.readline()
print(line2)
发现出现了如下错误提示:
Traceback (most recent call last):
File "C:/Users/zym/AppData/Local/Programs/Python/Python39/3.py", line 5, in
line2=file.readline()
ValueError: I/O operation on closed file.
意思是要读取的文件已经被关闭了。
由此可知,当with语句运行结束后,被打开的test.txt文件就自动关闭了。
15.4读取文件
在Python 中读取文件的方法有:
1、读取指定个数的字符
格式如下:
File.read([size])
其中,file为打开的文件对象。size为可选参数,可以指定要读取的字符个数,省缺表示读取所有内容。
在调用read()方法读取文件内容时,文件必须是以r(只读)或者r+(读写)方式打开。
如:
with open('test.txt','r',encoding='utf-8') as file:
txt=file.read() (或txt=file.read(10))
print(txt)
将读取、输出test.txt文件的全部内容(或前10个字符)。
2、移动文件的指针
对于刚打开的文件,文件指针总是指向文件头的。也可以通过seek()方法将文件的指针移动到新的位置。
格式如下:
file.seek(offset[,whence])
其中,file表示已经打开的文件对象;offset用于指定移动的字符个数;whence表示从哪个位置起始计算个数,其值为0表示从文件头开始计算,其值为1表示从当前位置开始计算,其值为2表示从文件尾开始计算,默认值为0。
例如:
with open('test.txt','r',encoding='utf-8') as file:
string=file.read(9)
print('取9个字符: '+string)
file.seek(2) #指针从文件头开始移动2个字符
string=file.read(9) #从当前位置读取10个字符
输出结果:
取9个字符:
Python是一种
取9个字符:
thon是一种解释
而下面的代码会抛出错误:
with open('test.txt','r',encoding='utf-8') as file:
file.seek(2,1) #指针从当前位置开始移动2个字符
string=file.read(10) #从当前位置读取10个字符
print('取10个字符: '+string)
错误提示为:
Traceback (most recent call last):
File "C:UserszymAppDataLocalProgramsPythonPython393.py", line 7, in
file.seek(2,1) #指针从当前位置开始移动2个字符
io.UnsupportedOperation: can't do nonzero cur-relative seeks
原因在于,必须使用b模式(即rb)打开文件,才能使用whence参数。但是,b模式(二进制)不适合文本文件。对于test.txt这样的文本文件,为了解决通过改变指针读取任意位置字符,可以采用加一个位置变量的方法来存储指针的值。
例如:
with open('test.txt','r',encoding='utf-8') as file:
#utf-8汉字与英文字符都占一个字符
string='' #设置一个空字符串
pointer=0 #当前指针为0
str1=file.read(6) #读取6个字符
pointer+=6 #指针变量后移6个字符
string+=str1 #string用来存放已读取的字符
print('取6个字符: ',str1)
file.seek(pointer) #指针从文件头开始移动2个字符
str1=file.read(8) #从当前位置读取10个字符
pointer+=8 #指针跳过已读取的字符
string+=str1
print('再取8个字符: ',str1)
print('所有读取的字符: ',string)
print('当前指针所处的位置: ',pointer)
str1=file.read(1)
print('当前指针所处的字符: ',str1)
运行结果如下:
取6个字符:
Python
再取8个字符:
是一种解释型语言
所有读取的字符:
Python是一种解释型语言
当前指针所处的位置:
14
当前指针所处的字符:
:
3、读取一行数据readline()方法
语法格式:
file.readline()
例:
with open('test.txt','r',encoding='utf-8') as f:
string=f.read(1) # 读取文件的第一个字符
if string != '': # 防止文件为空文件
lineno=0
while True:
line=f.readline()
if line != '':
lineno+=1
print('第'+str(lineno)+'行:'+line,end='')
# 因为每行都有自带的分行符,print()语句不允许换行
else:
break # 出现空行时停止读取
else:
print('要读取的文件为空文件!')
运行结果:
第1行:ython是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
第2行:Python是交互式语言: 这意味着,您可以在一个 Python 提示符 后直接执行代码。
第3行:Python是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
第4行:Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发。
4、读取全部行命令readlines()方法
语法格式:
File.readlines()
该方法与read()方法一样,在调用read()方法读取文件内容时,文件必须是以r(只读)或者r+(读写)方式打开。
例:
with open('test.txt','r',encoding='utf-8') as f:
txt=f.readlines()
print(txt)
运行结果:
['Python是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 ', 'Python是交互式语言: 这意味着,您可以在一个 Python 提示符 后直接执行代码。 ', 'Python是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。 ', 'Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发。 ']
从上面的运行结果可以看出,readlines()方法的返回值为一个字符串列表。所以,也可以以读取列表元素的方法输出。如下所示:
with open('test.txt','r',encoding='utf-8') as f:
txt=f.readlines()
for line in txt:
print(line,end='')
运行结果:
Python是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
Python是交互式语言: 这意味着,您可以在一个 Python 提示符 后直接执行代码。
Python是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发。
15.5 写入文件内容
语法格式如下:
file.write(string)
其中,file为打开的文件对象,string为要写入的字符串。
写入文件内容时,文件必须以w(可写)或a(追加)模式打开。否则,会抛出如下异常提示:
Traceback (most recent call last):
File "C:UsersAdministratorAppDataLocalProgramsPythonPython383.py", line 2, in
f.write('人生苦短,我用Python!')
io.UnsupportedOperation: not writable
关于write()方法的用法举例如下:
with open('test.txt','a',encoding='utf-8') as f:
f.write('人生苦短,我用Python!')
with open('test.txt','r',encoding='utf-8') as f:
txt=f.read()
print(txt)
运行结果:
Python是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
Python是交互式语言: 这意味着,您可以在一个 Python 提示符 后直接执行代码。
Python是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
Python是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发。
人生苦短,我用Python!
可以看出,由于文件的打开方式为a模式(追加模式),写入的内容被写入到文件的末尾。
在Python中,文件操作方法里没有类似于字符串内的计算长度、查找、替换、截取、分隔等方法,为什么没有?原因可能是文件的类型太复杂,譬如说二进制文件,上述操作的意义不大。如果仅仅要对文本文件进行上述操作,完全可以先把文件的内容读取到字符串中,再用相应的字符串函数或方法去操作就可以了。譬如,要将test.txt文件中的字符串‘Python’替换为’PHP’,则可以用如下代码完成:
txt1=''
with open('test.txt','r',encoding='utf-8') as f:
txt1=f.read() #先将文件内容存入字符串txt1中
txt2=txt1.replace('Python','PHP') #将txt1中的'Python'替换为'PHP',并存入txt2
with open('test.txt','w',encoding='utf-8') as f:
f.write(txt2) #将字符串txt2的内容写回到文件中
这里之所以分两步打开文件(第一次为r模式,第二次为w模式),而没有采用一次读写(r+、w+方式),因为那样比较容易出错。实践证明,将文件的读操作和写操作分开其实是非常正确的选择。
如何使用Python获取文件所在目录和文件名
import os.path
os.path.basename(文件路径) #获取文件名
os.path.dirname(文件路径) #获取目录
Python的os库的使用
python os库有很多和操作系统相关的功能。
其实不仅仅如此,os库中还有很多和文件,路径,执行系统命令相关的。
下面是os模块常用的方法.
1.os.sep 可以取代操作系统特定的路径分割符
2.os.name 字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'
3.os.getcwd() 函数得到当前工作目录,即当前Python脚本工作的目录路径
4.os.getenv() 用来读取环境变量
5.os.putenv() 用来设置环境变量
6.os.listdir() 返回指定目录下的所有文件和目录名
7os.remove() 函数用来删除一个文件
8.os.system() 函数用来运行shell命令
9.os.linesep 字符串给出当前平台使用的行终止符。例如,Windows使用'/r/n',Linux使用'/n'而Mac使用'/r'。
10.os.path.split() 函数返回一个路径的目录名和文件名
11.os.path.isfile() 检验给出的路径是一个文件
12os.path.isdir() 检验给出的路径是一个目录
13.os.path.existe() 函数用来检验给出的路径是否真地存在
14.os.listdir(dirname) 列出dirname下的目录和文件
15.os.getcwd() 获得当前工作目录
16.os.curdir 返回当前目录('.')
17.os.chdir(dirname) 改变工作目录到dirname
os.path都是和路径指定的文件,目录,和路径字符串有关系的函数
os.path.isdir(name) 判断name是不是一个目录,name不是目录就返回false
os.path.isfile(name) 判断name是不是一个文件,不存在name也返回false
os.path.exists(name) 判断是否存在文件或目录name
os.path.getsize(name) 获得文件大小,如果name是目录返回0L
os.path.abspath(name) 获得绝对路径
os.path.normpath(path) 规范path字符串形式
os.path.split(name) 分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.splitext() 分离文件名与扩展名
os.path.join(path,name) 连接目录与文件名或目录
os.path.basename(path) 返回文件名
os.path.dirname(path) 返回文件路径
R、python的文件夹操作
Python OS模块
1.重命名:os.rename(old, new)
2.删除:os.remove(file)
3.列出目录下的 文件 :os.listdir(path)
4.获取当前工作目录:os.getcwd()
5.改变工作目录:os.chdir(newdir)
6.创建多级目录:os.makedirs(r"c:/python /test")
7.创建单个目录:os.mkdir("test")
8.删除多个目录:os.removedirs(r"c:/python") #删除所给路径最后一个目录下所有空目录。
9.删除单个目录:os.rmdir("test")
10.获取文件属性:os.stat(file)
11.修改文件权限与时间戳:os.chmod(file)
12.执行操作系统 命令:os.system("dir")
13.启动新进程:os.exec(), os.execvp()
14.在后台执行程序:osspawnv()
15.终止当前进程:os.exit(), os._exit()
16.分离文件名:os.path.split(r"c:/python/ hello.py ") – ("c://python", " hello.py ")
17.分离扩展名:os.path.splitext(r"c:/python/ hello.py ") – ("c://python//hello", ".py")
18.获取路径名:os.path.dirname(r"c:/python/ hello.py ") – "c://python"
19.获取文件名:os.path.basename(r"r:/python/hello.py") – "hello.py"
20.判断文件是否存在:os.path.exists(r"c:/python/hello.py") – True
21.判断是否是绝对路径:os.path.isabs(r"./python/") – False
22.判断是否是目录:os.path.isdir(r"c:/python") – True
23.判断是否是文件:os.path.isfile(r"c:/python/hello.py") – True
24.判断是否是链接文件:os.path.islink(r"c:/python/hello.py") – False
25.获取文件大小:os.path.getsize(filename)
26.*******:os.ismount("c://") – True
27.搜索目录下的所有文件:os.path.walk()
[2.shutil]
1.复制单个文件:shultil.copy(oldfile, newfle)
2.复制整个目录树:shultil.copytree(r"./setup", r"./backup")
3.删除整个目录树:shultil.rmtree(r"./backup")
[3.tempfile]
1.创建一个唯一的临时文件:tempfile.mktemp() – filename
2.打开临时文件:tempfile.TemporaryFile()
[4.StringIO] #cStringIO是StringIO模块的快速实现模块
1.创建内存 文件并写入初始数据 :f = StringIO.StringIO("Hello world!")
2.读入内存文件数据:print f.read() #或print f.getvalue() – Hello world!
3.想内存文件写入数据:f.write("Good day!")
4.关闭内存文件:f.close()
rm(list=ls())
path = 'J:/lab/EX29 --在R语言中进行文件(夹)操作'
setwd(path)
cat("file A\n", file="A") #创建一个文件A,文件内容是'file A','\n'表示换行,这是一个很好的习惯
cat("file B\n", file="B") #创建一个文件B
file.append("A", "B") #将文件B的内容附到A内容的后面,注意没有空行
file.create("A") #创建一个文件A, 注意会覆盖原来的文件
file.append("A", rep("B", 10)) #将文件B的内容复制10便,并先后附到文件A内容后
file.show("A") #新开工作窗口显示文件A的内容
file.copy("A", "C") #复制文件A保存为C文件,同一个文件夹
dir.create("tmp") #创建名为tmp的文件夹
file.copy(c("A", "B"), "tmp") #将文件夹拷贝到tmp文件夹中
list.files("tmp") #查看文件夹tmp中的文件名
unlink("tmp", recursive=F) #如果文件夹tmp为空,删除文件夹tmp
unlink("tmp", recursive=TRUE) #删除文件夹tmp,如果其中有文件一并删除
file.remove("A", "B", "C") #移除三个文件