文件的读取

在做数据分析的过程中,经常会遇到文件的读取。我想很多人都在这个环节遇到过问题,所以就把自己掌握的一些文件读取方法记录下来,以及过程中遇到的一些状况和解决方法列出来,以便交流。

open

open() 函数用于创建或打开指定文件,该函数的语法格式如下:

file = open(file_name [, mode[, buffering]])

参数说明:

  • file:表示要创建的文件对象。
  • file_name:要创建或打开文件的文件名称。
  • mode:可选参数,用于指定文件的打开模式。默认以只读(r)模式打开文件。
  • buffing:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

不同模式打开文件的完全列表:

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

基本用法如下:

f = open('filename', 'r')
print(f.read())
f.close()  # 释放文件

简易写法:with语句结束会自动关闭文件

with open('filename', 'r') as f:
    print(f.read())

file 对象方法

  • file.read([size]):size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。

  • file.readline():返回一行。

  • file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行。

  • for line in f: print(line) :通过迭代器访问。

  • f.write("hello\n"):如果要写入字符串以外的数据,先将他转换为字符串。

  • f.tell():返回一个整数,表示当前文件指针的位置(就是到文件头的比特数)。

  • f.seek(偏移量,[起始位置]):用来移动文件指针。

    • 偏移量: 单位为比特,可正可负
    • 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
  • f.close() 关闭文件

文件的编码问题

在读取文件的时候,容易出现编码问题,例如:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb8 in position 0: invalid start byte

这是因为open()函数在读取文件时默认使用utf-8编码,当文件编码不匹配时,就会报类似上面的编码错误。这时可以通过指定编码类型来解决,例如:

with open('filename', 'r', encoding='gbk') as file: 
    file.read()

大文件的读取技巧

python读取文件一般情况是利用open()函数以及read()函数来完成,但这种方法适用于读取小文件,因为read()函数会将数据读入内存。当需读取文件大于内存的大小时,会造成MemoryError,也就是发生内存溢出。所以需要一定的技巧来实现大文件的读取。

解决方法:

(1)read(参数):通过参数指定每次读取的大小长度,循环读取

with open('filename','r') as file:
    while True:
        block = file.read(1024)
        if not block:
            break

(2)readline():每次获取一行数据

with open('filename','r') as file:
    for line in file.readline():
        pass    # 对应操作

(3)对可迭代对象file进行迭代,这样会自动的使用buffered IO以及内存管理

with open('filename','r') as file:
    for line in file:
        pass    #   对应操作

json

当我们读取的文件是Json格式的时候,利用json包可以方便的将数据转换为python的字典格式

Json模块提供了四个功能:dumps、dump、loads、load

  • dumps把数据类型转换成字符串
  • dump把数据类型转换成字符串并存储在文件中
  • loads把字符串转换成数据类型
  • load把文件打开从字符串转换成数据类型

示例,将一个字符串转换为字典:

import json
string = '{"name":"张三", "age":24}'
dict1 = json.loads(string)

 

posted @ 2019-09-23 22:28  薛定谔的python  阅读(347)  评论(0编辑  收藏  举报