读文件
open()的用法
如果你想要用python读取文件(如txt、csv等),第一步要用open函数打开文件。
open()是python的内置函数,它返回一个文件对象,这个文件的对象拥有read、readline、write、close等方法
open函数有2个参数:
open(‘file’,’mode’)
- file:需要打开的文件路径
- mode:打开文件的模式,如只读、追加、写入等
mode常用的模式
- r:表示文件只能读取
- w:表示文件只能写入
- a:表示打开文件,在原有内容的基础上追加内容,在末尾写入
- w+:表示可以对文件进行读写双重操作
当你需要以字节(二进制)形式读写文件时,只需要在mode参数中追加‘b’即可。
字符编码。要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数。
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')
>>> f.read()
'测试'
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。可以使用errors参数忽略
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
with关键字
优点:当句子结束后文件会正确关闭,即使在某个时刻引发了异常。
>>> with open('workfile') as f:
... read_data = f.read()
>>> f.closed
True
close()方法
打开文件并处理完毕后,需要关闭文件,常用以下搭配:
f = open(file) # 打开文件
f.close() # 关闭文件
read()方法
read(size)会读取一些数据并将其作为字符串(在文本模式下)或字节对象返回。简单说,就会输出文件中的所有文件
参数size(可选)为数字,表示从已打开文件中读取的字节计数,默认情况下为读取全部。
with open('1.txt','r')as f:
print(f.read())
# 输出结果
this
is
a test
readline()方法
readline方法从文件中读取整行,包括换行符’\n’。
f.readline(size),参数size表示从文件读取的字节数。
假设有一个文件1.txt,共三行,内容如下:
this
is
a test
readline函数读取文件操作
with open('1.txt','r')as f:
print(f.readline(10)) # 只输出第一行,第一行最多是4个字节,所以size如果大于4,不管多少都是this
print(f.readline(1)) # 输出的结果为1
print(f.readline()) # 输出的结果为s和空行,原因,readline方法会记住上一个readline函数读取的位置,接着读取下一行。
print(f.readline())
#输出结果,空行代表'\n'
this
i
s
a test
readlines()方法
readlines读取所有行,返回的是所有行组成的列表。
readlines方法没有参数
with open('1.txt','r')as f:
print(f.readlines())
# 输出结果
['this\n', 'is\n', 'a test']
write()方法
它只有一个参数。
f.write([str]) # f为文件对象
with open('1.txt','w') as f:
f.write('hello,my friends!\nthis is python big data analysis')
f.close()
操作文件
import os
os.name #操作系统类型
os.uname #获取详细的系统信息
os.environ。 #可以直接查看在操作系统中定义的环境变量。如果要获取某个环境变量的值,可以调用os.environ.get(‘key’)
操作文件和目录
# 查看当前目录的绝对路径:
>>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 把一个路径拆分为目录和文件名(或者最后级别的目录)
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
# os.path.splitext()可以直接让你得到文件扩展名
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
# 对文件重命名
>>> os.rename('test.txt', 'test.py')
# 删除文件
>>> os.remove('test.py')
注意:复制文件的函数不在os模块中,原因是复制文件并非操作系统提供的系统调用。
我们可以使用shutil模块中的copyfile函数。
如何利用Python的特性来过滤文件。
>>>import os
# 列出当前目录下的所有目录,只需要一行代码:
>>>[x for x in os.listdir('.') if os.path.isdir(x)]
['.lein', '.local', '.m2', '.npm', '.ssh', '.Trash', '.vim', 'Applications', 'Desktop', ...]
# 要列出所有的.py文件,也只需一行代码:
>>>[x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']
练习:
1、利用os模块编写一个能实现dir -l输出的程序
2、编写一个程序,能在当前目录以及当前目录的所有子目录下查找文件包含指定字符串的文件,并打印出相对路径。