3.4 读写文本数据

不论是以何种方式获取的文本数据,在进行分析之前,都要读取到分析环境中。 Python 提供了必要的函数和方法进行文件基本读写操作:利用 open 函数打开文件,创建 file 对象,通过 file 对象方法来实现大部分的文件操作。

3.4.1 open 函数

open 函数用来打开文件,并返回 file 对象,最简单的调用方式为:open(file,mode)。

参数说明:

(1)file:要打开的文件路径+文件名,若是在当前目录下,只需传入文件名,且该参数是 open 函数唯一强制传入的参数 (2)mode:文件打开模式,参数取值选项及含义见下表: @todo 插入参数说明表

常用的模式组合有:

@todo 插入模式组合表格 3.4.1

3.4.2 file 对象方法

Python 为 open 函数返回的 file 对象提供了一系列方法,让使用者更轻松的对文件进行操作

3.4.2.1 write

以写模式打开的文件,可以通过调用 write() 方法将任何字符串写入文件,且不会在字符串的结尾添加换行符('\n'),调用方式为:file.write(string)

例 在当前目录下创建新文件并写入


In []:f=open("test.txt","w") # 以只写模式打开文件 test.txt
       f.write("text""\n""mining""\n""with""\n") # 在文件中写入字符串并换行("\n"为换行符)
       f.close()

最后一行为文件对象的 close 方法,此处调用该方法是因为:在此我们写文件时,系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入,通过调用 close()方法,系统会把没有写入的数据全部写入磁盘,此时打开文件才能看到写入的内容,如果不执行 close 方法,很可能打开文件后看不到任何内容。后续在 3.4.2.5 部分会进一步介绍该方法。

执行完以上语句后,在 notebook 文件列表中即可看到新建的 test.txt 文件,打开后文件内容如下如所示:

@todo 插入文件截图 3.4.2.1-1

例 在已有文件末端追加内容


In []:f=open("test.txt","a")
       f.write("python""\n")
       f.close()

执行完以上语句后,在 notebook 文件列表中重新打开 test.txt 文件,可以看到最后一行追加了 “python" 字符串

@todo 插入文件截图 3.4.2.1-2

例 打开已有文件并写入新内容覆盖原内容


In []:f=open("test.txt","w")
       f.write("1\n""2\n""3\n")
       f.close()

执行完以上语句在 notebook 文件列表中重新打开 test.txt 文件,可以看到之前写入的内容已经被覆盖了:

@todo 插入文件截图 3.4.2.1-3

3.4.2.2 read

已经存在的并以读模式打开的文件,可以调用 read()方法读取文件内容,文件内容以一个字符串的形式返回,调用方式为:file.read(size),参数 size 为可选数值型参数,省略或为负数时将读取全部文件内容,除非文件内容超过内存。

例 读文件


In []:f=open("test.txt")
      f.read()
Out[]:'1\n2\n3\n'
In []:f.close()

3.4.2.3 readline

readline 方法每次读取文件的一行,若返回空字符串则表示已经读取到文件结尾,调用方式为:file.readline()


In []:f=open("test.txt")
      f.readline()
Out[]:'1\n'
In []:f.readline()
Out[]:'2\n'
In []:f.readline()
Out[]:'3\n'
In []:f.readline()
Out[]:''
In []:f.close()

3.4.2.4 readlines

readlines 方法读取文件的所有行,并返回一个字符串列表,调用方式为:file.readlines()


In []:f=open("test.txt")
      f.readlines()
Out[]:['1\n', '2\n', '3\n']
In []:f.close()

如果需要将文件内容读取到列表中,除了调用 readlines 方法外,还利用 list() 函数处理 file 对象:


In []:f=open("test.txt")
      l=list(f)
      print l
      ['1\n', '2\n', '3\n']
In []:f.close()

3.4.2.5 close

在以上的示例中,多次出现 close 方法,在反复调用 write() 方法来写入文件的同时,也务必要调用 close() 来关闭文件。这是因为,当我们写文件时,系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入,调用 close 方法后,操作系统才能保证把没有写入的数据全部写入磁盘,如果忘记调用 close 方法,可能会导致只写了一部分数据到磁盘。此外,打开的文件对象会占用系统的资源,系统同一时间能打开的文件数量也是有限的。所以要适时调用 close 方法,调用方式为:file.close()

但是如果每次读写文件都要执行 close 方法,不仅麻烦也容易忘记,幸运的是,Python 的 with 语句可以很好的解决这一问题,它会在语句执行完后,自动执行 close(),避免了不断调用 close 方法的麻烦,使用 with 语句更加方便简洁也更加保险。调用方式为:

with open(file,mode) as *: 执行语句

参数说明:

(1)file:要打开的文件路径+文件名 (2)mode:文件打开模式 (3)*:文件变量,可以自行指定变量名称


In []:with open("test.txt","r") as f:
          data=f.readlines()
          print data
     ['1\n', '2\n', '3\n']

3.4.3 csv 模块

CSV 即逗号分隔值(Comma-Separated Values),是一种以纯文本形式存储表格数据的存储形式。CSV 文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录内部常以逗号分隔,在 excel 中显示为不同列。

比如,现在有一份以 CSV 格式存储的数据 data.csv

@todo 插入csv数据截图 3.4.3-1

将 data.csv 上传到 Jupyter Notebook 文件列表中,打开文件可以看到 CSV 文件中有四条记录,每条记录都换行存储,记录内用逗号分隔,这些分隔的内容在 excel 中显示为三列。

@todo 插入文件截图 3.4.3-2

按照本节前半部分介绍的方法直接使用 open 函数打开文件


In []:with open("data.csv") as f:
          for i in f:
              print i
      a,b,c

      1,2,3

      4,5,6

      7,8,9

去除数据之间的逗号需要逐行处理


In []:data=[]
      with open("data.csv") as f:
          for i in f:
              row = i.split(',')
              data.append(row)              
In []:data
Out[]:[['a', 'b', 'c\r\n'],
       ['1', '2', '3\r\n'],
       ['4', '5', '6\r\n'],
       ['7', '8', '9\r\n']]

我们可以利用以上方式实现 CSV 文件的处理,但是如果元素内部包含逗号或者某些字段包含引号,仍然使用这种方法就需要处理较多的细节问题,而不能更专注于后续的分析过程,幸运的是 Python 提供了内建 csv 模块,实现 csv 文件的读写和处理,csv 模块的两个主要函数分别为 reader 和 writer,分别用于读取和写入 CSV 文件数据,要查看 csv 模块下所有的函数,可以执行 dir(csv) 语句实现,下面主要说明 CSV 格式文件的读取和写入。

3.4.3.1 reader

reader 函数可以遍历给定文件的每一行,每一行都读取为一个字符串列表,最终返回一个 reader 对象,调用方法为:csv.reader(csvfile, dialect='excel', **fmtparams)

参数说明:

csvfile:需要处理的文件,必须是可迭代的对象,可以是 file 文件对象或者 list 列表对象,如果是 file 对象,要以二进制模式"b"打开。 dialect:可选参数,用于设定编码风格,默认为 excel 的风格,也就是用逗号分隔。另外,csv 模块也支持 excel-tab风格,也就是制表符(tab)分隔。其它的方式需要自行定义,此处不做详细说明。 fmtparam:格式化参数,用来覆盖之前 dialect 对象指定的编码风格。


In []:import csv  
      with open("data.csv","rb") as cf:  
          rows=csv.reader(cf)  
          for row in rows:  
              print row  
      ['a', 'b', 'c']
      ['1', '2', '3']
      ['4', '5', '6']
      ['7', '8', '9']

首先,导入 csv 模块,利用 open 函数打开欲读取的“data.csv”文件,返回了文件对象 cf;接着给 csv.reader()传入了第一个参数,即文件对象名称,另外两个参数采用默认值,即以 excel 风格读入;最后 reader() 函数返回一个 reader 对象 rows,rows 是一个列表,逐行打印列表中的元素即可得到以上输出结果。

3.4.3.2 writer

writer 函数用于将待输入的数据转换为分隔的字符串并写入 csv 文件,返回一个 writer 对象,调用方式为:csv.writer(csvfile, dialect='excel', **fmtparams),参数解释说明参见上方 reader 函数参数说明。

writer 对象有两个方法可以用于文件内容的写入:writerow 和 writerows,writerow 用于写入一行,writerows 用于写入多行。

例 利用 writerow() 方法写入一行内容


In []:with open("data.csv","wb") as cf: 
          mywriter=csv.writer(cf)  
          mywriter.writerow(["A","12","34"])
In []:with open("data.csv","rb") as cf:  
          rows=csv.reader(cf)
          for row in rows:  
              print row 
      ['A', '12', '34']

首先,利用 open 函数以写模式打开当前路径下的名字为“data.csv”的文件,若不存在这个文件,则创建它,并返回文件对象 cf;接着给 csv.writer() 传入了第一个参数,即文件对象名称,另外两个参数采用默认值,即以 excel 风格写入,返回 writer 对象 mywriter;利用 writerow() 方法写入一行内容;最后重新打开当前路径下的名字为“data.csv”的文件,可以看到原来文件的内容已经被覆盖。

例 利用 writerows() 方法写入多行内容


In []::with open("data.csv","wb") as cf: 
          mywriter=csv.writer(cf)  
          mywriter.writerows([["A","12","34"],["B","45","78"]])
In []:with open("data.csv","rb") as cf:  
          rows=csv.reader(cf)
          for row in rows: 
              print row  
      ['A', '12', '34']
      ['B', '45', '78']

results matching ""

    No results matching ""