最近在公司写RF自动化测试用例,Web测试,当时写这个的时候,有位大佬给了几个他自己写的例子和基于selenium库写的一些方法,基于Python标准库的一些方法,今天写的时候,翻看大佬写的自建库的一些方法,使用他写的方法中关于读写文件这块总是报错,于是上网查了查,以下分享我查到的关于Python标准库对于文件的基本操作和文件路径中存在中文编码的处理。
你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行读写。
file = open(file_name [, access_mode][, buffering])
各个参数的细节如下:
file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
r |
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ |
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
File 对象的 close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
当一个文件对象的引用被重新指定给另一个文件时,Python 会关闭之前的文件。用 close()方法关闭文件是一个很好的习惯。
fileObject.close()
例子:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
# 关闭打开的文件
fo.close()
write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
write()方法不会在字符串的结尾添加换行符('\n'):
fileObject.write(string)
read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
语法:
fileObject.read([count])
在这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。
一个文件被打开后,你有一个file对象,你可以得到有关该文件的各种信息。
以下是和file对象相关的所有属性的列表:
属性 |
描述 |
file.closed |
返回true如果文件已被关闭,否则返回false。 |
file.mode |
返回被打开文件的访问模式。 |
file.name |
返回文件的名称。 |
file.softspace |
如果用print输出后,必须跟一个空格符,则返回false。否则返回true。 |
如下实例:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# 打开一个文件
fo = open("foo.txt", "w")
print "文件名: ", fo.name
print "是否已关闭 : ", fo.closed
print "访问模式 : ", fo.mode
print "末尾是否强制加空格 : ", fo.softspace
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:
序号 |
方法及描述 |
1 |
file.close() 关闭文件。关闭后文件不能再进行读写操作。 |
2 |
file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 |
file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 |
file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 |
file.next() 返回文件下一行。 |
6 |
file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 |
file.readline([size]) 读取整行,包括 "\n" 字符。 |
8 |
file.readlines([sizehint]) 读取所有行并返回列表,若给定sizeint>0,则是设置一次读多少字节,这是为了减轻读取压力。 |
9 |
file.seek(offset[, whence]) 设置文件当前位置 |
10 |
file.tell() 返回文件当前位置。 |
11 |
file.truncate([size]) 截取文件,截取的字节通过size指定,默认为当前文件位置。 |
12 |
file.write(str) 将字符串写入文件,返回的是写入的字符长度。 |
13 |
file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
file object = open(file_name [, access_mode][, buffering]
我们直接从电脑复制的路径是这种"C:\Windows\System32\drivers\etc\test.txt"
路径写法(filename写法):
采用下面任何一种书写形式均可:
/
”: "C:/Windows/System32/drivers/etc/test.txt"
不用反斜杠就没法产生歧义了(推荐使用此写法“/",可以避免很多异常)
"C:\\Windows\\System32/\\drivers\\etc\\test.txt"
因为反斜杠是转义符,所以两个”\\
“就表示一个反斜杠符号
r"C:\Windows\System32\drivers\etc\test.txt"
python下在字符串前面加上字母r
,表示后面是一个原始字符串raw string,不过raw string主要是为正则表达式而不是windows 路径设计的,所以这种做法尽量少用,可能会出问题。(前面加r
说的是读取到原始字符串)。
open(filename, 'w')这个方法中,filename这个参数必须是Unicode编码的参数。
我之前加上#-*-coding:utf-8-*-将编码设置为utf-8,当调用这个方法往里传参数时,需要将这个变量filename解码成 Unicode。
比如filename='中文.txt',使用open()时,这样写open(filename.decode('utf-8'), 'w'),这样创建的中文文件名就没有乱码问题
python直接读取中文路径的文件时失败,可做如下处理:
inpath ='
C:/Windows/System32/drivers/宝宝/test.txt'
uipath = unicode(ipath , "utf8")
然后用"uipath"经过编码后的路径去open()即可:
fin = open(uipath)
打开路径含有中文的文件时,要注意:
在windows对文件名编码是采用gbk等进行编码保存,所以要将文件路径先解码,在按gbk编码:
字符串--解码成unicode--编码(注意str和unicode的转换)
with open(r"D:\我的文档\桌面\python\test.py".decode('utf8').encode('gbk'),'rb') as f:
print f.read()
或者采用
#coding=utf-8 #当然这里要在前面设置系统的编码方式
with open(ur"D:\我的文档\桌面\python\test.py".encode('gbk'),'rb') as f:
或者with open(ur"D:\我的文档\桌面\python\test.py",'rb') as f:
摘要: 在windows使用gbx(gb2312,gbk,gb18030我也不知道是哪个)对文件名及文件路径进行编码保存。打开文件的函数中使用诸如open(filename.encode('gbk'))可以很好的解决。另外路径分隔符要写Unix风格的'/',不要写'\'
windows使用gbx(gb2312,gbk,gb18030我也不知道是哪个)对文件名及文件路径进行编码保存。打开文件的函数中使用诸如open(filename.encode('gbk'))可以很好的解决。
a="C:\Users\Dell\Desktop\ATOU\测试用例" (带中文的路径)
a=a.decode("utf-8").encode("gbk") (进行转码)
import sys
sys.path.append(a) (指定路径成功)
合并起来一条:
import sys
sys.path.append("C:\Users\Dell\Desktop\ATOU\公共测试用例".decode("utf-8").encode("gbk"))
文件的路径出现了解析错误的情况,所以在传入文件路径的时候先把文件的编码格式转了先给代码前边加
#encoding=utf-8
#encoding=utf-8
inpath = 'D:/学习/python/python学习/cc.txt'
uipath = unicode(inpath , "utf8")
fr=open(uipath,"r")
f=fr.read()
print f
fr.close()
找了这么多,基本都是找的别人的例子,以上关于中文处理不保证有效性,遇到这个多试试吧,我分享一下我最后的做法。
f = open(r"C:\Windows\System32\drivers\etc\”+u”
中文测试"
,"r")
1 、据说python3就没有中文路径文件操作报错这个问题了,奈何我用的是2.7。
2、 u’字符串’ 代表是unicode格式的数据,路径最好写成这个格式,别直接跟字符串’字符串’这类数据相加,相加之后type 就是str,这样就会存在解码失误的问题。
3、在查找资料过程中,有一种说法就是路径不能超过五层,也就是路径中“\”最多四个,我当时的“\”就是四个,没试过五 个会怎么样。
这么多东西算是大杂烩,找了很多资料总结的,我可以说没学过Python,暂时也没打算学,所以查东西的时候,没往深的探究,贴出来的知识也都很基础,希望能和大家一起讨论分享,共同进步。