python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python中os模块

Python中os模块的使用及文件对象的读写详解

作者:徕胖

这篇文章主要介绍了Python中os模块的使用及文件对象的读写详解,Python open() 方法用于打开一个文件,并创建返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError,需要的朋友可以参考下

os模块和os.path() 模块

#导入模块
import os
print(os.name)#输出字符串表示正在使用的平台。如果是window,则用'nt'表示。如果是linux/unix,则输出'posix'
print(os.getcwd())#函数得到当前工作目录,即当前python脚本工作的目录路径
print(os.listdir())#返回指定目录下的所有文件和文件夹目录名(文件夹下的内容不显示)。此时输出的是os.getcwd()路径下的内容
print(os.listdir('C:\人机交互')) #此时输出的是C:\人机交互  目录下的内容
os.chdir('C:\人机交互')#切换目录。os.chdir() 方法用于改变当前工作目录到指定的路径。
print(os.getcwd()) #切换目录后,再次查看

在这里插入图片描述

os.path() 模块

#os.path.split(path)	把路径分割成 dirname 和 basename,返回一个元组
print(os.path.split('C:\\Users\\。\\Python基础学习'))
#os.path.exists(path)	如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。
print(os.path.exists('C:\\Users\。\Python基础学习'))

在这里插入图片描述

相对路径和绝对路径

#要打开"C:\人机交互\test.txt"。
#此时的工作目录为:C:\Users\。\Python基础学习
print(os.getcwd())
f = open('test.txt') #这种写法是相对路径

在这里插入图片描述

由上面的运行结果可以看出,报错。

因为当前的工作路径为C:\Users\。\Python基础学习。

而这个路径下没有test.txt。(即当前工作目录不是文件所在目录,不能用相对路径)写成绝对路径则不会报错。

如下代码:

#要打开"C:\人机交互\test.txt"。
#此时的工作目录为:C:\Users\。\Python基础学习
print(os.getcwd())
f = open(r"C:\人机交互\test.txt") #绝对路径

若想要写成相对路径,则要切换工作目录。如下:

#要打开"C:\人机交互\test.txt"。
os.chdir("C:\人机交互")
#在申明了目录之后,就可以直接写文件名了。
f = open('test.txt') #相对路径
print(f.read())

在这里插入图片描述

文件路径的书写格式

.csv就是带格式的.txt文本文件,又叫逗号分隔符文件。.csv可以直接用excel打开,也可以用记事本打开

#路径的书写格式
#使用单个斜杠:/
path1 = 'C:/python数据分析/text.txt' #单引号或双引号均可
#使用两个反斜杠:\\。第一个斜杠代表转义字符
path2 = "C:\\python数据分析\\text.txt"
#使用r,r用于防止转义字符
path3 = r"C:\python数据分析\text.txt"
'''
若只用但个反斜杠\,会发现有时候行,有时候不行。因为反斜杠\可以转义很多字符,以便在字符串中可以使用一些特殊字符
比如\n表示换行,\t表示制表符。
所以最好不要使用单个反斜杠
'''
print(path1,type(path1))
print(path2)
print(path3)

在这里插入图片描述

print('\p')#未转义,以普通字符输出
print('\t')#转义字符,\t代表制表符

在这里插入图片描述

文件对象 python file文件链接

file 对象使用 open 函数来创建,下面列出了 file 对象常用的函数: 注意:open()函数的用法见(3)

在这里插入图片描述

file.close()关闭文件。关闭后文件不能再进行读写操作。
file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
file.next()返回文件下一行。
file.read([size])从文件读取指定的字节数,如果未给定或为负则读取所有。
file.readline([size])读取整行,包括 “\n” 字符。
file.readlines([sizeint])读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。
file.seek(offset[, whence])设置文件当前位置,用于移动文件读取指针到指定位置。
file.tell()返回文件当前位置。
file.truncate([size])截取文件,截取的字节通过size指定,默认为当前文件位置。
file.write(str)将字符串写入文件,返回的是写入的字符长度。
file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符

打开文件,open语句

Python open() 方法用于打开一个文件,并创建返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。 如:f = open(file, mode=‘r’) f是一个文件对象

注意:使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。

open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。open(file, mode=‘r’)

完整的语法格式为:open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 参数说明:file: 必需,文件路径(相对或者绝对路径)、mode: 可选,文件打开模式。 buffering: 设置缓冲、encoding: 一般使用utf8、errors: 报错级别、newline: 区分换行符 closefd: 传入的file参数类型

注意:用w或a模式打开文件的话,如果文件不存在,那么就自动创建。 此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。

#读取文件:open语句
#python open() 函数用于打开一个文件,创建一个 file 对象,
#open(file, mode='r', encoding=None)即:open('路径','模式',encoding='编码')
#模式: r(读取文件,默认),w(写入),rw(读取写入),a(追加)
f = open(path1)
print(type(f))
print(f)

在这里插入图片描述

查看文件的编码方式

encoding设置方法 查看文件的编码方式:以.csv或者.txt为例,先用记事本打开该文件,然后点击另存为,在弹出的另存为对话框中,你就可以看到文件的编码格式

如下图,可以看出IRIS.csv的编码方式为UTF-8

在这里插入图片描述

encoding设置: 当文件编码方式为ANSI时,encoding=‘gbk’ 当编码方式为UTF-8时,encoding=‘utf8’

读取文件fileObject.read(),以及f.readline()、f.readlines()

fileObject.read(size=-1); size : 从文件中读取的字符数,如果未给定或为负则读取所有。

注意:读取后,光标会停留在读取末尾,再次运行.read()之后,由于光标位于末尾,再次读取输出为空

#fileObject.read(size=-1); size -- 从文件中读取的字节数,如果未给定或为负则读取所有。
#读取后,光标会停留在读取末尾,再次运行.read()之后,由于光标位于末尾,再次读取输出为空
print('首次读取')
print(f.read())
print('二次读取')
print(f.read())
print('down')

在这里插入图片描述

#现在用f.seek()来移动光标
f.seek(0)
print(f.read(2))
print(f.read(3))
f.seek(0)

在这里插入图片描述

f.readline()和f.readlines()

f.readline() 方法用于从文件读取整行,包括 “\n” 字符。一次性读取一行 f.readline(n) #读取该行的前n个字符 f.readlines() 方法用于读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for… in … 结构进行处理。也会读取\n。 f.readlines()返回列表,包含所有的行。无参数。

文件内容如下:

在这里插入图片描述

path = r"C:\python数据分析\text1.txt"
f = open(path,encoding='utf8')
f.seek(0)
print(f.readline()) #因为会读取换行符\n,所以输出的结果中一行空白
print(f.readline(4))
print(f.readline(4))
print(f.readline())

在这里插入图片描述

f.seek(0)
for line in f.readlines():
    print(type(line),line)

在这里插入图片描述

file.seek(offset[, whence])

设置文件当前位置

seek() 方法用于移动文件读取指针到指定位置。 fileObject.seek(offset[, whence=0])

参数:offset – 开始的偏移量,也就是代表需要移动偏移的字节数

whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;

0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。

返回值:如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。

#现在用f.seek()来移动光标
#现在用f.seek()来移动光标
print('首次读取')
print(f.read())
print('二次读取')
print(type(f.seek(0)))
print(f.read())
print('down')
f.seek(0)

在这里插入图片描述

文件的写入f.write(str)、f.writelines(seq)

write(str) 方法用于向文件中写入指定字符串。 在文件关闭前或缓冲区刷新前,字符串内容存储在缓冲区中,这时你在文件中是看不到写入的内容的。 语法:参数:str 要写入文件的字符串。返回值:返回的是写入的字符长度。(Returns the number of characters written (which is always equal to the length of the string).)

注意:如果文件打开模式带 b,那写入文件内容时,str (参数)要用 encode 方法转为 bytes 形式,否则报错:TypeError: a bytes-like object is required, not ‘str’。

import os
path = r"C:\python数据分析\text3.txt"
f = open(path,'w',encoding='utf8')
print(f.write('你好,世界!'))
print(f.write('hello world!'))
f.close()

在这里插入图片描述

writelines() 方法用于向文件中写入一序列的字符串。

这一序列字符串可以是由迭代对象产生的,如一个字符串列表。

换行需要制定换行符 \n。

语法如下:fileObject.writelines( [str]) 参数:str – 要写入文件的字符串序列。

返回值:该方法没有返回值。

path = r"C:\python数据分析\text2.txt"
f = open(path,'w',encoding='utf8')
lst = ['hello','wordl','你好呀']
f.writelines(lst)
f.close()
#f.writelines(lst)依次把元素写入,但没有加换行符。
#如果要想加上换行符,则需要在每个元素后面加上\n

打开text2.txt。文件内容如下:

在这里插入图片描述

path = r"C:\python数据分析\text2.txt"
f = open(path,'w',encoding='utf8')
lst = ['hello','wordl','你好呀']
for i in range(len(lst)):
    lst[i] = lst[i] + '\n'
print(lst)
f.writelines(lst)
f.close()
#f.writelines(lst)依次把元素写入,但没有加换行符。
#如果要想加上换行符,则需要在每个元素后面加上\n

在这里插入图片描述

关闭文件f.close()

f.close()
#print(f.read()) #关闭后无法读取

到此这篇关于Python中os模块的使用及文件对象的读写详解的文章就介绍到这了,更多相关Python中os模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文