八、读写文件

关于《python编程快速上手-让繁琐工作自动化》的学习笔记

1.文件与文件路径

文件有两个关键属性:“文件名”和“路径”。路径指明了文件在计算机上的位置,路径中的C:\部分是“根文件夹”,它包含了所有其它文件(windows中根文件夹名为C:\,也称C:盘,在OSX和Linux中根文件夹是/);文件名中最后一个句点之后的部分称为文件的“扩展名”。(文件夹名称和文件名在windows和OSX上不区分大小写,但在Linux上区分大小写)

  • windows上的倒斜杠以及OSX和Linux上的正斜杠
    windows上,路径书写使用倒斜杠作为文件夹之间的分隔符;OSX和Linux上使用正斜杠作为他们的路径分隔符
    使用os.path.join()函数处理文件夹之间的分隔符(将单个文件和路径上的文件夹名称的字符串传递给它,该函数会返回一个文件路径的字符串,包含正确的路径分隔符(会根据操作系统的不同返回正确的文件路径的字符串))
>>> import os
>>> os.path.join('user','bin','spam')
'user\\bin\\spam'   #每个倒斜杠需要倒斜杠来转义

>>> myfiles=['accounts.txt','details.csv','invite.docx']
>>> for filename in myfiles:
        print(os.path.join('C:\\Users\\asweigart',filename))

C:\Users\asweigart\accounts.txt
C:\Users\asweigart\details.csv
C:\Users\asweigart\invite.docx
  • 当前工作目录
    使用os.getcwd()函数可以取得当前工作路径的字符串,并可以使用os.chdir()函数来改变它
>>> os.getcwd()
'C:\\Users\\G3'
>>> os.chdir('C:\\Windows')
>>> os.getcwd()
'C:\\Windows'
  • 绝对路径与相对路径
    • 绝对路径总是从根文件夹开始
    • 相对路径相对于程序的当前工作目录
    • 点(.)和点点(..)文件夹,它们不是真正的文件夹,而是可以在路径在中使用的特殊名称。单个的句点(“点”)用作文件夹目名称时,是这个目录的缩写;两个句点(“点点”)是父文件夹
  • 使用os.makedirs()创建新文件夹
    为确保完整路径名存在,os.makedirs()将创建所有必要的中间文件夹
import os
>>> os.makedirs('C:\\Users\\G3\\test')
  • os.path模块
    os.path模块包含了许多与文件名和文件路径相关的有用函数
    os.path模块的完整文档
  • 处理绝对路径和相对路径
    • os.path.abspath(path)将返回参数的绝对路径的字符串
    • os.path.isabs(path),如果参数是一个绝对路径就返回True;如果参数是一个相对路径就返回False
    • os.path.relpath(path,start)将返回从start路径到path的相对路径的字符串;若没有提供start路径就是用当前工作目录作为开始路径
    • os.path.dirname(path)将返回一个字符串包含path参数中最后一个斜杠之前的所有内容
    • os.path.basename(path)将返回一个字符串包含path参数中最后一个斜杠之后的所有内容
    >>> os.path.basename('C:\\Users\\G3\\aapt.exe')
    'aapt.exe'
    >>> os.path.dirname('C:\\Users\\G3\\aapt.exe')
    'C:\\Users\\G3'
    
    • 如果同时需要一个路径的目录名称和基本名称,可以调用os.path.split()获得这两个字符串的元组
    >>> os.path.split('C:\\Users\\G3\\aapt.exe')
    ('C:\\Users\\G3', 'aapt.exe')
    >>> 'C:\\Users\\G3\\aapt.exe'.split(os.path.sep)
    ['C:', 'Users', 'G3', 'aapt.exe']
    

os.path模块提供一些函数返回一个相对路径的绝对路径以及检查给定的路径是否为绝对路径

  • 查看文件大小和文件夹内容
    • os.path.getsize(path)将返回path参数中文件的字节数(注意:path指的是文件的路径,不是文件夹的路径,文件夹及其子文件大小不能用该函数来计算)
    • os.listdir(path)将返回文件名字符串的列表,包含path参数中的每个文件
  • 检查路径有效性
    • 如果path参数所指的文件或文件夹存在,调用os.path.exists(path)将返回True,否则返回False(可以使用这个函数检测DVD或U盘是否连接在计算机上)
    • 如果path参数存在并且是一个文件,调用os.path.isfile(path)将返回True,否则返回False
    • 如果path参数存在并且是一个文件夹,调用os.path.isdir(path)将返回True,否则返回False
>>> os.path.isdir('C:\test')
True
>>> os.path.isdir('C:\test\test1')
True
>>> os.path.isdir('C:\test\test1\test2.txt')
False
>>> os.path.exists('G:\\')
False
>>> os.path.exists('G:\\')
True

2.文件读写过程

python读写文件有三个步骤:
1.调用open()函数,返回一个File对象
2.调用File对象的read()或write()方法
3.调用File对象的close()方法关闭该文件

  • 使用open()函数打开文件
    向open()函数传递一个字符串路径表明希望打开的文件,这既可以是绝对路径也可以是相对路径,open()函数返回一个File对象。在python中打开文件时,读模式是默认的模式;也可以明确指定该模式:向open()传入字符串’'r’作为第二个参数
  • 读取文件内容
    使用File对象的read()方法将整个文件的内容读取为一个字符串值
    使用redlines()方法从文件中取得一个字符串的列表,列表中的每个字符串就是文本的一行
>>> a=open(r'C:\test\test1.txt')
>>> a.read()
'1224325'
>>> b=open(r'C:\test\test2.txt')
>>> b.readlines()
['1224325\n', 'hello\n', 'world\n', 'nice\n', '!!!']
  • 写入文件
    如果打开文件时以读模式,就不能写入文件;需要以“写入纯文本模式”或“添加纯文本模式”打开文件,或简称为“写模式”和“添加模式”
    将’w’作为第二个参数传递给open()以写模式打开该文件;将’a’作为第二个参数传递给open()以添加模式打开该文件。如果传递给open()的文件名不存在,写模式和添加模式都会创建一个新的文件。在打开的文件上调用write()并向该方法传入字符串参数,将字符串写入文件并返回写入的字符个数包括换行符,然后关闭该文件。在读取或写入文件后,调用close()方法然后才能再次打开该文件(注意:write()方法需要自己手动在字符串的末尾添加换行符)
>>> file=open('C:\\test\\test3.txt','a')
>>> file.write('abcdefghijklmn\n')
15
>>> file.close()
>>> file=open('C:\\test\\test3.txt','a')
>>> file.write('123456789\nhello world!\nThanks\n')
30
>>> file.close()
>>> file=open('C:\\test\\test3.txt','r')
>>> content=file.read()
>>> print(content)
abcdefghijklmn
123456789
hello world!
Thanks

>>>

3.使用shelve模块保存变量

利用shelve模块,可以将变量保存到二进制的shelf文件中。调用shelve.open()函数并传入一个文件名,然后返回的值保存在一个变量中,完成相应的修改后调用close()。对于二进制文件不必使用读或写模式打开,因为它们在打开后既能写又能读(shelf值有keys()和values()方法,返回shelf中键和值的类似列表但不是真正的列表)

>>> import shelve
>>> shelffile=shelve.open('mydata')
>>> cats=['Zophine','Pooka','Simon']
>>> shelffile['cats']=cats
>>> shelffile.close()
>>> shelffile=shelve.open('mydata')
>>> type(shelffile)
<class 'shelve.DbfilenameShelf'>
>>> shelffile['cats']
['Zophine', 'Pooka', 'Simon']
>>> shelffile.close()
>>> shelffile=shelve.open('mydata')
>>> list(shelffile.keys())
['cats']
>>> list(shelffile.values())
[['Zophine', 'Pooka', 'Simon']]
>>> shelffile.close()

4.使用pprint.pformat()函数保存变量

pprint.pformat()函数返回一个易于阅读且语法正确的python字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值