精华内容
下载资源
问答
  • Python3中打开文件的方式(With open

    万次阅读 多人点赞 2018-08-05 19:53:16
    python文件读写文件是最常见的IO操作... 读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象读取数据(读文件),或者把数据写入这个文件对象(写文件...

    0.背景知识 & IO操作的类型

    • python文件读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。
    • 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘。
    • 读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)

    常见的IO操作的类型如下:

    type info
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。


    1.常规方式:读取文件-----open()


    step1: 打开

    
    f = open( '/Users/michael/test.txt', 'r' )
    
    
    • r 表示读取文件,我们就成功地打开了一个文件
    • 但是, 如果文件不存在,open()函数就会抛出一个IOError的错误,并且给出错误码和详细的信息告诉你文件不存在,错误情况如下:
    
    f=open('/Users/michael/notfound.txt', 'r')
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/notfound.txt'
    
    

    step2: 读取

    如果文件打开成功,接下来,调用read()方法可以一次读取文件的全部内容,Python把内容读到内存,用一个str对象表示:

    
    f.read()
    'Hello, world!'
    
    

    step3: 关闭

    最后一步是调用close()方法关闭文件。文件使用完毕后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的:

    
    f.close()
    
    

    由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,我们可以使用try … finally来实现:

    最终方案:

    
    try:
    	f = open('/path/to/file', 'r')
    	print(f.read())
    finally:
    	if f:
    		f.close()
    		
    


    2.推荐方式:读取文件-----With Open

    1).读取方式

    每次如果都按照如上最终方案去写的话,实在太繁琐。Python引入了with语句来自动帮我们调用close()方法
    重点:!!!with 的作用就是自动调用close()方法 !!!

    
    with open( '/path/to/file', 'r' ) as f:
    	print( f.read() ) 
    
    # 这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法
    	
    

    f.read(): 读取全部文件内容
    f.read(size): 每次读取size个字节内容
    f.readline(): 每次读取一行的内容
    f.readlines(): 读取全部内容,但结果是个list,每行内容是一个元素


    如果遇到超大文件,需要注意:

    • 调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了。
    • 要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。例如,read(1024) 每次读取1024个字节的数据内容
    • 调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。
    • 如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:
    
    for line in f.readlines():
    	print( line.strip() ) 
    
    
    # 读取文件之后,文字末尾会出现'\n'
    # strip() 函数中可以把目标内容line里面所有的空格,空行等都删除掉,只剩余文字内容
    


    2).常见的坑

    这里写图片描述

    读取静态文件的函数,最好不要写相对路径!!!

    (1)如上图,Fold001文件夹下面有个read_file.py文件,这个文件读取hello.txt文件,代码如上图,这样可以正常引用
    (2)但如果引用静态文件的函数,被其他函数再次调用的时候。 例如被Fold002里面的函数read.py调用,那么readfile()函数相当于是在read.py所在目录执行的,那么静态文件hello.txt相对于read.py的路径,就不是上图的路径了,否者会运行会报错,如下

    这里写图片描述



    3.写入内容----open()函数

    写文件和读文件是一样的,唯一区别是调用open()函数时,传入标识符’w’或者’wb’表示写文本文件或写二进制文件:

    
    f = open('/Users/michael/test.txt', 'w')
    f.write('Hello, world!')
    f.close()
    
    

    open函数使用注意地方:

    • 你可以反复调用write()来写入文件,但是务必要调用f.close()来关闭文件。
    • 当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。
    • 只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险


    4.写入内容----- With Open函数

    
    with open('/Users/michael/test.txt', 'w') as f:
    	f.write('Hello, world!')
    	
    

    要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码字符编码



    5.打开非utf-8编码的文件

    要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件:

    
    with open('/Users/michael/gbk.txt', 'r', encoding='gbk') as f:
        f.read()
    	
    
    • 遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
    • open()函数还接收一个errors参数,errors=‘ignore’ 表示遇到编码错误的时候直接忽略
    
    with open('/Users/michael/gbk.txt', 'r', encoding='gbk',errors='ignore') as f:
        f.read()
        
    


    6.打开二进制文件

    前面讲的默认都是读取文本文件,并且是UTF-8编码的文本文件。要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件即可:

    
    with open('/Users/michael/test.jpg', 'rb') as f:
        f.read()
    
    #  b'\xff\xd8\xff\xe1\x00\x18Exif\x00\x00...'            十六进制表示的字节
    
    
    展开全文
  • 当我面有数据需要保存时,第一时间一般会想到写到一个txt文件中,当然,数据量比较大的时候还是写到数据库比较方便管理... python读写文件估计大家都用open内置函数,或者file这个工厂函数,这两个的效果基本一样。...

      当我面有数据需要保存时,第一时间一般会想到写到一个txt文件中,当然,数据量比较大的时候还是写到数据库比较方便管理,需要进行网络传输时要序列化,json化。下面主要整理一下平时用的最多的写入到文件中,一般以txt结尾,linux里不会以后缀来区分文件类型,后缀可以随便,也可以没有。

          python读写文件估计大家都用open内置函数,或者file这个工厂函数,这两个的效果基本一样。

          打开文件的方式一般为:f=open(file_name,access_mode = 'r',buffering = -1)。file_name就是文件的路径加文件名字,不加路径则文件会存放在python程序的路径下,

    access_mode就是操作文件的模式,主要有r,w,rb,wb等,细节网上一大堆,buffering = -1是用于指示访问文件所采用的缓存方式。0表示不缓存;1表示只缓存一行,n代表缓存n行。如果不提供或为负数,则代表使用系统默认的缓存机制。

          打开以后就是写和读的操作。但是用open方法打开会有一些问题。open打开文件只能写入str类型,不管字符串是什么编码方式。例如:

    >>> fr = open('test.txt','a')
    >>> line1 = "我爱祖国"
    >>> fr.write(line1)

    这样是完全可以的。但是有时候我们爬虫或者其他方式得到一些数据写入文件时会有编码不统一的问题,所以就一般都统一转换为unicode。此时写入open方式打开的文件就有问题了。例如

    >>> line2 = u'我爱祖国'
    >>> fr.write(line2)
    
    Traceback (most recent call last):
      File "<pyshell#4>", line 1, in <module>
        fr.write(line2)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11: ordinal not in range(128)
    >>> 

     

    怎么办,我们可以将上面的line2编码成str类型,但是太麻烦。我们要把得到的东西先decode为unicode再encode为str。。。

    input文件(gbk, utf-8...)   ----decode----->   unicode  -------encode------> output文件(gbk, utf-8...)

    代替这繁琐的操作就是codecs.open,例如

    >>> import codecs
    >>> fw = codecs.open('test1.txt','a','utf-8')
    >>> fw.write(line2)
    >>> 

    不会报错,说明写入成功。这种方法可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数 是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述 操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

     

    总结一下:文件读尽量用第二种方法,一般不会出现编码的问题。至于用第二种方法有什么缺点,我没有研究过。。

    展开全文
  • 文件打开方式当我们用open()函数去打开文件的时候,有好几种打开的模式。"r"->只读"w"->只写,文件已存在则清空,不存在则创建。"a"->追加,写到文件末尾"b"->二进制模式,...

    文件打开方式

    当我们用open()函数去打开文件的时候,有好几种打开的模式。

    "r"->只读

    "w"->只写,文件已存在则清空,不存在则创建。

    "a"->追加,写到文件末尾

    "b"->二进制模式,比如打开图像、音频、word文件。

    "+"->更新(可读可写)

    这个带"+"号的有点难以理解,上代码感受下。

    with open("foo.txt", "w+") as f:

    f.write("bar ")

    f.seek(0)

    data = f.read()

    可以看到,上面这段代码,它不但可以写,还可以读出来。注意要先定位到开头,f.seek(0),不然读出来的是空数据。

    一些人可能会有迷惑,既然带"+"号是可读可写,那"w+"跟"r+"有什么不同。

    那就是,

    "w+"会清空,会创建 (文件已存在则清空,不存在则创建。)

    "r+"不清空,不创建

    不要用二进制模式打开文本文件先看下面代码的“诡异”现象。

    假设在windows下,我有个f.txt文件,里面的内容是下面这样的。

    hello

    world

    代码一,

    with open("f.txt", "r") as f:

    print f.readlines()

    with open("f.txt", "rb") as f:

    print f.readlines()

    输出

    ["hello ", "world "]

    ["hello ", "world "]

    代码二,

    with open("f.txt", "rb") as f:

    data = f.read()

    with open("f.txt", "w") as f:

    f.write(data)

    打开文件,变成了下面这样,

    hello^M

    world^M

    首先,先理解换行符" "跟回车符" "的概念。

    " ",换行符(LF,Line-Feed ),指新的一行。

    " ",回车符(CR,Carriage-Return),指回到行头。

    因为在不同系统下的换行标识是不一样的。

    windows->" "

    unix->" "

    mac->" "

    这就是为什么windows下的txt在linux打开的时候行尾会有"^M"。

    这就是为什么我在linux下跑脚本导出游戏数据下到本地windows打开变成了一行。

    其实文本文件也是二进制文件,是文本编码的二进制文件,文本文件对一些不可见字符进行了处理,增加可读性。

    在python中,可以通过os.linesep获得当前系统的换行标识。比如在windows下,os.linesep是" "。

    在python中操作换行标识的时候,并不用管是在什么平台下,直接用" "就行了,python会自动根据不同系统转成不同标识。

    有了上面这些理论依据,就可以解析本文开头代码的“诡异”现象了。

    代码一中,用文本模式打开的文件,换行标识会被python处理成" ",而用二进制模式打开则原封不动。

    代码二中,用二进制模式打开,用文本模式写入。二进制打开原封不动还是" ",而文本模式写入的时候因为python会把" "转成" ",所以其实就等于是写入了" ",于是就多了个"^M"。

    展开全文
  • 刚刚用open(fileName)来打开txt格式的文件,总是出现错误,总是找不到文件读取的内容,后来才发现是open()在使用过程自动关闭了。这里介绍另种方法解决这个问题。第一种方法。with open(fileName) as file_...

    刚刚用open(fileName)来打开txt格式的文件,总是出现错误,总是找不到文件读取的内容,后来才发现是open()在使用过程中自动关闭了。这里介绍另种方法解决这个问题。

    第一种方法。

    with open(fileName) as file_object:

    content=file_object.read()

    其实就是将文件对象保存给file_object,然后将文件内容读取保存给content,这种方法Python会在程序不需要调用文件时自动关闭文件,不需要我们去调用close()来关闭文件。

    当我们过早的调用close()时,需要使用文件时就会出现文件无法调用的情况,所以不推荐自己使用open(),close()方式来打开文件。

    第二种方法。

    将文件内容保存到列表里面,这样就算文件关闭了,我们直接访问列表里面保存的文件内容就可以了。

    with open(fileName) as file_name:

    lines=file_name.readlines()for line inlines:print(line.rstrip())

    用readlines()来将内容保存到列表里,并且通过逐行访问列表内容来获得文件内容。

    例子:

    1 defloadData(fileName):2 dataMat=[];labelMat=[]3 fr=open(fileName)4 dataContent=fr.readlines()5 #用一个列表把文件内容装起来,否则用open打开文件后会自动关闭,在后面直接访问fr时文件已经关闭,获取不到文件了,

    6 #也可以用with open (fileName) as fr:这种操作会根据文件使用情况来自动关闭

    7 featNum=len(dataContent[0].strip().split(' '))-1#数据的属性数量

    8 print(featNum)9 for line indataContent:10 lineArr =[]11 curLine=line.strip().split(' ')#对每行数据分割成与属性数相等的数据

    12 for i inrange(featNum):13 lineArr.append(float(curLine[i]))14 dataMat.append(lineArr)15 labelMat.append(float(curLine[-1]))16 return dataMat,labelMat

    如果我们去掉dataContent=fr.readlines()这一行内容,而一直用fr来不断的调用文件,会发现无法掉出数据,因为文件在第一次使用后就关闭了,后面的文件便无法调用出来。

    展开全文
  • 刚刚用open(fileName)来打开txt格式的文件,总是出现错误,总是找不到文件读取的内容,后来才发现是open()在使用过程自动关闭了。这里介绍另种方法解决这个问题。第一种方法。with open(fileName) as file_...
  • Python中打开文件的方式(With open

    万次阅读 2019-03-28 11:39:17
    python文件读写文件是最... 读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象读取数据(读文件),或者把数据写入这个文件对象(写文件) 文章目...
  • python中打开文件

    2020-07-24 10:09:43
    f=open(‘notfound.txt’, ‘r’)
  • 下面小编就为大家分享一篇解决python使用open打开文件中文乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 对于Python打开文件的模式,总是记不住,这次在博客里记录一下  r+: Open for reading and writing. The stream is positioned at the beginning of the file.  w+:Open for reading and writing. The file is ...
  • f=open(r’C:\Users\Administrator\Desktop\your_file.txt’,‘r’) 文件地址,在属性常规的地址+文件名。windows前加上‘r’,代表read.
  • 文件是指记录在存储介质上的一组相关信息集合。在操作系统下,文件名由文件主名和扩展名...Python 使用 open( ) 方法以读文件的方式打开文件,传入文件名与标识符,格式如下:file = open('filename.txt', mode =...
  • python中open()函数用于打开一个文件,创建file对象,相关方法才可以调用它进行读写语法:open(name,[,model[,buffering]])模式描述r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。rb以二进制...
  • Python中文件open,close,read,write等操作

    万次阅读 多人点赞 2018-08-13 14:22:31
    Python既然作为开发语言,肯定不可避免...在Python中要操作文件需要记住 1 个函数和 3 个方法 序号 函数/方法 说明 01 open 打开文件,并且返回文件操作对象 02 read 将文件内容读取到内存 ...
  • python中打开文件和关闭文件的方法

    千次阅读 2020-06-17 15:55:19
    1)打开文件 1、关于open 模式: r 以读方式打开, f=open(r"C:\Users\readme.txt","r") w以写方式打开, 如果文件存在则会清洗掉原文件的内容,然后把写的东西写进新文件 f=open(r"C:\Users\readme.txt","w") #...
  • python中打开文件,readlines使用教程: 在一个txt文件中存入数据,用with open(…) as …的方式打开文件,代码如下: pi.txt内容: 3.141592665 897989549 122556689 测试代码如下: print('***************...
  • 刚刚用open(fileName)来打开txt格式的文件,总是出现错误,总是找不到文件读取的内容,后来才发现是open()在使用过程自动关闭了。这里介绍另种方法解决这个问题。 第一种方法。 with open(fileName) as ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,129
精华内容 1,651
关键字:

python中打开文件open

python 订阅