《python 与数据挖掘 》一 2.5 文件的读写

本节书摘来自华章出版社《python 与数据挖掘 》一书中的第2章,第2.5节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问“华章计算机”公众号查看。

2.5 文件的读写

文件访问是一门语言重要的一环,适当地进行文本读写能够保存一次程序运行下来的结果。在数据挖掘的工作中,数据量很大,整个挖掘程序可以分为几部分,我们应该把每一部分运行的结果都保存下来,这样如果后面的程序出现错误,我们也不必再从头开始。而数据挖掘中最普遍的是对txt、csv等文件进行读写处理。

2.5.1 改变工作目录

要进行文件的读写,首先要设置工作目录。如果使用脚本运行,那么默认的工作目录为脚本所在的目录。但大多数时候我们会将数据文件放在某个固定目录,要改变工作目录,首先要引入os模块,语句为:import os。查看当前工作目录的方法是os.getwd(),改变工作目录的方法是os.chdir(string),如代码清单2-21所示:
代码清单2-21 改变工作目 录


import os
os.chdir('F:/Data') # 改变路径至F盘的Data文件夹下,注意不是反斜杠
print os.getcwd()
# result: F:\数据集
*代码详见:示例程序/code/2-5.py

2.5.2 txt文件读取

Python进行文件读写的函数是open或file。其格式如下:
file_handler = open(filename,mode='r')
其中filename是我们希望打开的文件的字符串名字,mode表示我们的读写模式,所有模式如表2-10所示,默认为read模式。如果此语句执行成功,那么一个文件句柄就会返回,后面的文件操作需依赖文件句柄的方法进行。表2-11给出了文件句柄的所有方法。
表2-10 读写模式
模式 说明
‘r’ 以读方式打开文件,仅可读取文件信息
‘w’ 以写方式开始文件,仅可向文件写入信息。如果文件存在,则清空该文件,再进行写入。如果文件不存在则自动创建
‘a’ 以追加模式打开文件,文件指针自动移动到文件末尾,仅可从文件末尾开始写入,如果文件不存在则自动创建
‘r+’ 以读写方式打开文件,可对文件进行读写操作
‘w+’ 消除文件内容,然后以读写方式打开文件。如果文件不存在则自动创建
‘a+’ 以读写方式打开文件,并把文件指针移到文件末尾。如果不存在则自动创建
‘b’ 以二进制模式打开文件,而不是以文本模式

表2-11 文件句柄方法
f.close() 关闭文件,记住用open()打开文件后须得关闭它,否则会占用系统的可打开文件句柄数
f.flush() 刷新输出缓存
f.read([count]) 读出文件,如果有count,则读出count个字节
f.readline() 读出一行信息
f.readlines 读出所有行,也就是读出整个文件的信息
f.seek(offset[,where]) 把文件指针移动到相对于where的offset位置。where为0表示文件开始处,这是默认值;1表示当前位置;2表示文件结尾
f.tell() 获得文件指针位置
f.write(string) 把string字符串写入文件
f.writelines(list) 把list中的字符串一行一行地写入文件,是连续写入文件,没有换行

我们常用的文件读入函数是readline()和readlines()。首先我们假设在我们脚本目录下有这样一个data.txt,其数据如下:
1,2
3,4
注意第一行中有一个换行符。如果我们采用readline()语句读取,执行f=open('data.txt','r')和 a =f. readline(),那么就会将第一行以字符串的形式返回,此时a='1,2\n'。同时文件指针指向第一行末尾,如果再执行语句b = f.readline(),那么b='3,4',此时文件指针就指向文件末尾,文件已读取完毕。可以使用下面的while循环读取所有语句:
L=2#文件的行数


for i in range(L):
    a = readline()
    # 对该行的处理

如果我们想去掉第一行的读取的换行符,可以使用语句a=a.strip(),strip()可以去掉一个字符串开头和末尾的空白字符,包括换行符,已在2.4.2节中介绍到。
而readlines则返回一个列表,列表包含了每一行的字符串数据。如执行a=f.readlines(),那么此时a=['1,2\n','3,4'],代码清单2-22给出了一个读取数据的例子,其数据是用于回归预测的COIL数据集。例子最终保存的形式是一个二维列表,在后面的数据处理可以很容易的变换为numpy.array,大部分数据挖掘的算法都需要numpy.array作为数据存储的格式。
代码清单2-22 文件读写

data=[]  # 先定义存储数据的总列表,总列表的每个元素都是一个列表,各存储一行数据
fr = open('ticdata2000.txt')    # 打开文件
for line in fr.readlines(): # readlines()返回一个字符串列表,每个字符串存储一行原始数据
    line = line.strip() # 去掉换行符
    data_line = line.split("\t")    # 通过字符串的制表符"\t"分隔数据,并且返回一个列表,使用列表存储该行数据
    data.append(data_line)  # 将存储一行数据的列表添加到总列表中
print data[0]   # 输出第一行的数据
fr.close()
*代码详见:示例程序/code/2-5.py

2.5.3 csv文件读取

我们习惯使用Excel表存储数据,但Excel表数据直接用Python读取是行不通的。一个常用的办法是将文件另存为csv文件格式。csv是逗号分隔符的数据表,每两个数据单元间用逗号分隔,实际上和txt文件没有本质的区别。在代码清单2-22中,数据文件的数据是用制表符分隔的,如果改成用逗号分隔,再把后缀名改成csv,那就转换成了csv文件。同理,csv文件读取的处理与txt几乎一样,使用语句f=open('data.csv')读取,这里不再举例赘述。如果我们使用pandas模块,那么读入csv文件会更快捷方便,直接使用pandas.read_csv()方法即可,本书后面会介绍pandas模块。

2.5.4 文件输出

在2.5.2节中,我们把数据1,2,3,4成功读入到程序中,现在我们考虑,假设我们的程序中得出了一个二维列表data=[['1','2'],['3','4']],我们重新输出到文件,还原为2.5.2节中的原始数据。我们可以使用方法f.write(string),并且借助字符串的join方法输出到文件中。如果二维列表的元素不是字符类型而是整数类型,我们不能使用join方法,使用f.write(string)输出比较麻烦,这里介绍另一种更灵活的输出到文件的方式:print>>>f。这样就会把原本print函数输出到shell的内容改为输出到文件中,请参考代码清单2-23。
代码清单2-23 文件输出


f = open('output.txt','w')
# 使用join方法和write方法
data=[['1','2'],['3','4']]
line1 = ','.join(data[0])
f.write(line1+'\n')
line2 =','.join(data[1])
f.write(line2+'\n')
# 使用print>>>f,
data=[[1,2],[3,4]]
for line in data:
    print>>>f,str(line[0])+','+str(line[1])+'\n',
f.close()
*代码详见:示例程序/code/2-5.py

2.5.5 使用JSON处理数据

从代码清单2-23中读者可以看出,保存数值型数据比保存字符串类型的数据容易得多。因为wtite(string)方法只能输出字符串,且read()函数只会返回字符串,想转化为数值型数据需用int()这样的函数。当想保存列表和字典这样复杂的数据结构时,单靠read()和write()去人工解析是很困难的。幸运的是,Python允许用户使用常用的数据交换格式JSON(JavaScript Object Noation)。标准模块json可以接受Python数据结构,并将它们转换为字符串表示形式,此过程称为序列化(Serialize)。从字符串表示形式重新构建数据结构称为反序列化(Deserialize)。序列化和反序列化的过程中,表示该对象的字符串可以存储在文件中。
假设现在有一个字典x=dict(height=176,weight=60),可以使用y=json.dumps(x)将x转换为一个字符串y。反过来可以使用json.loads(y)将字符串转为原来的字典。如果想保存到文件中或读取JSON文件,可以使用上面函数的变体dump()和load(),代码清单2-24给出了具体实例。
代码清单2-24 使用json处理数据


import json
# 使用dumps()和loads()
x=dict(height=176,weight=60)
print '原始字典内容:',x
y = json.dumps(x) # 返回字符串
print '序列化后的字典:',y
x = json.loads(y)
print '反序列化后又还原为原始的字典:',x

# 使用dump()和load()
f=open('BigData.json','w')
json.dump(x,f) # 保存到文件中
f.close()

f=open('BigData.json','r')
print '从文件读取到的JSON:',json.load(f)
*代码详见:示例程序/code/2-5.py
时间: 2025-01-01 13:38:14

《python 与数据挖掘 》一 2.5 文件的读写的相关文章

《python 与数据挖掘 》 一 导读

前 言 为什么要写本书? Python是什么? Python是一种带有动态语义的.解释性的.面向对象的高级编程语言.其高级内置数据结构,结合动态类型和动态绑定,使其对于敏捷软件开发非常具有吸引力.同时,Python作为脚本型(胶水)语言连接现有的组件也十分高效.Python语法简洁,可读性强,从而能降低程序的维护成本.不仅如此,Python支持模块和包,鼓励程序模块化和代码重用. Python语言的解释性使其语法更接近人类的表达和思维过程,开发程序的效率极高.习惯使用Python者,总习惯在介绍

《python 与数据挖掘 》一1.3 Python开发环境的搭建

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第1章,第1.3节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 1.3 Python开发环境的搭建 所谓编程语言,意指"与计算机交流时使用的语言".它是一种被标准化的交流技 巧,用于连接程序员的思维和计算机的操作.学习编程语言的第一关,就是安装和环境配置.我们必须与计算机约定如何理解代码.指令和语法,才能够顺利地与计算机交流,赋予它复杂的功能.Python

《python 与数据挖掘 》一 第2章 Python基础入门

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第1章,第2.1节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 第2章 Python基础入门 本章是Python的基础章节,读者可以在这章中学习到丰富的Python基础知识.首先我们会从操作符和最简单的数字数据入手,然后就是流程控制,到这里读者能够对Python程序结构有一个清晰的认识.接着是较复杂的数据结构,主要涉及Python最常用的五大内建数据类型:列表,字符串,元组,

《python 与数据挖掘 》一 2.6 上机实验

本节书摘来自华章出版社<python 与数据挖掘 >一书中的第2章,第2.6节,作者张良均 杨海宏 何子健 杨 征,更多章节内容可以访问"华章计算机"公众号查看. 2.6 上机实验 1.实验目的掌握Python流程控制语句,合理运用循环进行程序设计.掌握Python数据结构,并能熟练运用进行程序设计.掌握Python的文件读写,并能编写读取数据集的程序.2.实验内容实验一冒泡排序是一个经典的排序算法,任意给定一个Python的列表SList ,要求使用Python实现冒泡排

Python编程中用close()方法关闭文件的教程

  这篇文章主要介绍了Python编程中用close()方法关闭文件的教程,是Python编程入门中的基础知识,需要的朋友可以参考下 close()方法方法关闭打开的文件.关闭的文件无法读取或写入更多东西.文件已被关闭之后任何操作会引发ValueError.但是调用close()多次是可以的. Python自动关闭,当一个文件的引用对象被重新分配给另外一个文件.它使用close()方法来关闭一个文件一个很好的做法. 语法 以下是close()方法的语法: ? 1 fileObject.close

python通过wxPython打开一个音频文件并播放的方法

 这篇文章主要介绍了python通过wxPython打开一个音频文件并播放的方法,实例分析了wxPython操作音频文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了python通过wxPython打开一个音频文件并播放的方法.分享给大家供大家参考.具体如下: 这段代码片段使用wx.lib.filebrowsebutton.FileBrowseButton控件打开一个wav文件,使用wx.Sound播放 ? 1 2 3 4 5 6 7 8 9 10 11 12 13

python使用cStringIO实现临时内存文件访问的方法

 这篇文章主要介绍了python使用cStringIO实现临时内存文件访问的方法,涉及Python使用cStringIO模块操作内存的技巧,需要的朋友可以参考下     本文实例讲述了python使用cStringIO实现临时内存文件访问的方法.分享给大家供大家参考.具体分析如下: 如果希望从网络读取文件进行处理,但是又不希望保存文件到硬盘,可以使用cStringIO模块进行处理 ? 1 2 res = urllib2.urlopen(pic,timeout=10) f = cStringIO.

python清除指定目录内所有文件中script的方法

  本文实例讲述了python清除指定目录内所有文件中script的方法.分享给大家供大家参考.具体如下: 将脚本存储为stripscripts.py 调用语法 : python stripscripts.py 使用范例 : python stripscripts.py d:myfiles ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

python实现搜索指定目录下文件及文件内搜索指定关键词的方法

本文实例讲述了python实现搜索指定目录下文件及文件内搜索指定关键词的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 #!/usr/bin/pyt