400-800-8975

python如何读取数据

读取数据可以方便我们的工作,python中常见的数据读取方式有很多,那么python如何读取数据呢?一起来了解下吧:
python如何读取数据
python如何读取数据
利用pandas中的read_csv模块直接将数据读取出来。
data = pd.read_csv('/home/nw/Desktop/dataset/iris.txt',header = None)
1.上面的代码,read_csv中前面的是数据集存放的路径,后面的header很重要,经常以为少了header,数据的总量减小了1,因为少掉的那一行数据变成了DataFrame里面的列索引。
2. 还有一种是比较传统的方法,直接用open打开文件,把文件里面的信息先取出来,不管取出来是什么样子的,线取出来再说,想要作什么处理直接对取出的变量做处理即可。
f= open('/home/nw/Desktop/dataset/iris.txt','rb')
dataset = pickle.load(f)#这种方法适用于自己存取自己的数据,有时候在读取别人的数据的时候是不行的,因为别人存数据的方式不一定是用pickle.dump的方式存数据的。
f = open('/home/nw/Desktop/dataset/iris.txt')
'''
注意这里的open后面最好不要加上其他的读取方式,不需要‘rb’之类的读取方式。因为在后续的数据处理中可能还需要将二进制的数据转换成自己想要的个数。
'''
lines = f.readlines()
'''
现在lines中已经包含了所有的数据信息,我们想要得到的数据格式都可以基于lines做处理。如我读出的iris数据格式是一个列表的形式,使用len(lines)得到列表中元素的个数是151,打印出lines,可以看到lines中每个元素都是一个字符串,并且每个字符串后面都有' '的换行字符,最后一行是空行,所以最后一行是多余,并且要去掉每行中的' '
'''
arr = []
for i in range(len(lines)):
if lines[i] != ' ':
arr.append(lines[i])
for i in range(len(arr)):
arr[i] = arr[i].strip(' ')#将每行的' '脱去
有一种情况是用pandas读出来的数据,每一行是一个字符串的形式,而且将全部的列都整合在一行的字符串里面了,这样读取出来的数据是有误的,我们需要使用到的参数是:
delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用,等效于设定sep=’s+’。如果这个参数设定为Ture那么delimiter 参数失效。
如需要载入uci数据集中的auto-mpg.txt文件,如果使用
pd.read_csv(path,header = None)读出来的结果将是一行一行的字符串,如果添加参数delim_whitespace = True,那么就会得到想要的pandas格式
pd.read_csv(path,header = None,delim_whitespace = True)
如果数据之间不是按照空格来分列的,是按照‘,’来分隔的,那么我们就不用参数delim_whitespace这个参数作为分隔符,用sep = ‘,’
pd.read_csv(path,header = None,sep = ‘,’)
Python怎么读取和写入文件
读取整个文件
这里假设在当前目录下有一个文件名为’pi_digits.txt’的文本文件,里面的数据如下:
3.1415926535
8979323846
2643383279
with open('pi_digits.txt') as f: # 默认模式为‘r’,只读模式
contents = f.read() # 读取文件全部内容
print contents # 输出时在最后会多出一行(read()函数到达文件末会返回一个空字符,显示出空字符就是一个空行)
print '------------'
print contents.rstrip() # rstrip()函数用于删除字符串末的空白
3.1415926535
8979323846
2643383279
------------
3.1415926535
8979323846
2643383279
逐行读取
可以通过循环来实现逐行读取数据:
with open('pi_digits.txt') as f:
for line1 in f:
print line1 # 每行末尾会有一个换行符
print '------------'
for line2 in f:
print line2.rstrip() # 此时文件已经读完,line2指向文本末尾,因此不会有输出
3.1415926535
8979323846
2643383279
------------
读取文件时相当于有一个指针在记录读取的位置,数据读到哪,这个指针就指到哪边,继续读取数据时会从该位置继续读取,因此上面代码中第二个循环中输出为空。将上述代码稍加修改如下:
with open('pi_digits.txt') as f:
for line1 in f:
print line1
print '------------'
with open('pi_digits.txt') as f: # 需要重新打开文本进行读取
for line2 in f:
print line2.rstrip() # 删除字符串末尾的空白
3.1415926535
8979323846
2643383279
------------
3.1415926535
8979323846
2643383279
上述代码相当于第一次读取完后关闭该文件又重新打开进行读取。逐行读取数据也可以用readline()函数,如下:
with open('pi_digits.txt') as f:
# readline()每一次读取一行数据,并指向该行末尾
line1 = f.readline() # 读取第一行数据(此时已经指向第一行末尾)
line2 = f.readline() # 从上一次读取末尾开始读取(第二行)
print line1.rstrip()
print line2.rstrip()
3.1415926535
8979323846
有时候我们想要一次性读取全部数据并且按分开存储以便于后续的操作,当然用上面的循环可以实现,但python提供了更简单的方法readlines():
with open('pi_digits.txt') as f:
lines = f.readlines() # 读取文本中所有内容,并保存在一个列表中,列表中每一个元素对应一行数据
print lines # 每一行数据都包含了换行符
print '------------'
for line in lines:
print line.rstrip()
print '------------'
pi_str = '' # 初始化为空字符
for line in lines:
pi_str += line.rstrip() #字符串连接
print pi_str
['3.1415926535 ', '8979323846 ', '2643383279 ']
------------
3.1415926535
8979323846
2643383279
------------
3.141592653589793238462643383279
写数据到文件
写数据有几种不同的模式,最常用的是w’, ‘a’, 分别表示擦除原有数据再写入和将数据写到原数据之后:
filename = 'write_data.txt'
with open(filename,'w') as f: # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
f.write("I am Meringue. ")
f.write("I am now studying in NJTECH. ")
此时会在当前路径下创建一个’write_data.txt’的文本文件,并向文件中写入数据如下:
I am Meringue.
I am now studying in NJTECH.
下面继续在该文件中加入新数据:
with open(filename,'a') as f: # 'a'表示append,即在原来文件内容后继续写数据(不清楚原有数据)
f.write("I major in Machine learning and Computer vision. ")
此时的文件内容为:
I am Meringue.
I am now studying in NJTECH.
I major in Machine learning and Computer vision.
如何用Python脚本从文件读取数据
用Python读取本地文件的代码:
如何用Python脚本从文件读取数据
import os
#从标准库导入os模块
os.chdir('F:HeadFirstPythonchapter3')
#切换到包含数据文件的文件夹
data = open('sketch.txt')
#打开一个命名文件,将文件赋给名为data的文件对象
for each_line in data:
print(each_line, end='')
#循环读取文件没有内容
data.close()
#文件处理完成后关闭
通过for循环遍历文件每一行,直至完成。
其实也支持逐行读取的如print(data.readline(), end='')
Python怎么导入数据
1、read_csv(),用来读取CSV文件
官方文档是这么说的:Read CSV (comma-separated) file into DataFrame
在读取CSV之前首先得知道什么事CSV文件:csv文件的第一行是列名,后面的都是数据,列与列之间用逗号隔开,列名有时可以省略,如下所示
AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800
AAPL,31-01-2011, ,335.8,340.04,334.3,339.32,13473000
AAPL,01-02-2011, ,341.3,345.65,340.98,345.03,15236800
AAPL,02-02-2011, ,344.45,345.25,343.55,344.32,9242600
AAPL,03-02-2011, ,343.8,344.24,338.55,343.44,14064100
AAPL,04-02-2011, ,343.61,346.7,343.51,346.5,11494200
AAPL,07-02-2011, ,347.89,353.25,347.64,351.88,17322100
AAPL,08-02-2011, ,353.68,355.52,352.15,355.2,13608500
AAPL,09-02-2011, ,355.19,359,354.87,358.16,17240800
AAPL,10-02-2011, ,357.39,360,348,354.54,33162400
AAPL,11-02-2011, ,354.75,357.8,353.54,356.85,13127500
AAPL,14-02-2011, ,356.79,359.48,356.71,359.18,11086200
使用read_csv函数导入csv文件
语法:read_csv(file,encoding)
file:csv文件所在的路径,如果文件在工作路径下,这里直接写文件名就好,如果不在工作路径下,得把文件的路径也写上
encoding:文件的编码类型,如果导入的是中文,则设置为utf-8
%cd "E:WorkSpacePython"-------------->设置工作空间
例:
<pre name="code" class="python">In[35]:%cd "E:WorkSpacePython"
from pandas import read_csv
cs = read_csv("student.csv",encoding='utf-8')
cs
E:WorkSpacePython
我运行以上代码报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb8 in position 0: invalid start byte
于是我把cs = read_csv("student.csv",encoding='utf-8')改成cs = read_csv("student.csv"),没报错了,英文可以正常显示,但是中文读出来是乱码
后来我想会不会是文件本身的编码有问题,于是在Notepad中查看了一下文件的编码,果然不出所料,文件的编码是默认的ANSI格式,在Notepad里把文件编码改了,果然,成功排雷,读取成功了:结果如下:
In[35]:%cd "E:WorkSpacePython"
from pandas import read_csv
cs = read_csv("student.csv",encoding='utf-8')
cs
E:WorkSpacePython
Out[35]:
?付靖玲 23 女
0 Jeny 24 女
1 Tom 25 男
但是问题来了,因为我的数据没有列名,它读出来默认把我的第一行作为列名了,继续挖雷...,看了一下pandas的API,终于豁然开朗,大有收获,原来这个read_csv函数是有很多参数的,它的函数申明格式如下:
pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None,usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None,converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=None,nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False,iterator=False, chunksize=None, compression='infer', thousands=None, decimal='.', lineterminator=None,quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=False,error_bad_lines=True, warn_bad_lines=True, skip_footer=0, doublequote=True, delim_whitespace=False,as_recarray=False, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None,memory_map=False, float_precision=None)?
这里的每一个参数的用法我就不一一解释了,如果用到的时候可以去查看API,里面解释的非常清楚,继续说我的雷,API告诉我要解决这个问题,关键在于header这个参数,header参数的说明如下:
header : int or list of ints, default ‘infer’
Row number(s) to use as the column names, and the start of the data. Default behavior is as if set to 0 if no names passed, otherwise None. Explicitly pass header=0to be able to replace existing names. The header can be a list of integers that specify row locations for a multi-index on the columns e.g. [0,1,3]. Intervening rows that are not specified will be skipped (e.g. 2 in this example is skipped). Note that this parameter ignores commented lines and empty lines if skip_blank_lines=True, so header=0 denotes the first line of data rather than the first line of the file.
意思也就是说,这个参数是用来设置数据的列名的,默认第0行就是数据的列名,如果没有列名的话,就把这个参数设置成None,于是把代码改成以下形式
cs = read_csv("student.csv",encoding='utf-8',header=None)
cs
Out[45]:
0 1 2
0 ?付靖玲 23 女
1 Jeny 24 女
2 Tom 25 男
成功排了这颗雷。。。
1、read_table()
读入普通的文本文件,文本文件比csv文件更加自由,可以没有列名,列与列的分隔符没有规定,而且后缀名也是可以随意的
API中的声明:
pandas.read_csv(filepath_or_buffer, sep=', ', delimiter=None, header='infer', names=None, index_col=None,usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None,converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, skipfooter=None,nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True,parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False,iterator=False, chunksize=None, compression='infer', thousands=None, decimal='.', lineterminator=None,quotechar='"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=False,error_bad_lines=True, warn_bad_lines=True, skip_footer=0, doublequote=True, delim_whitespace=False,as_recarray=False, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None,memory_map=False, float_precision=None)?
官方文档是这么说的:Read general delimited file into DataFrame
常用的参数就前三个
filepath_or_buffer:文件路径
sep:分隔符,默认为空,表示导入为一列,分隔符也可以是一个字符串,如例子所示
names:列名,默认第一行为列名
encoding:文件编码,导入中文时需要设置为utf-8
例:我的文件里存的内容如下所示,我以love作为分隔符读出这个文件里的内容
12love34
34love545
343love455
767love545
>>> ca = pd.read_table("a.txt",sep='love',header=None)
>>> ca
0 1
0 12 34
1 34 545
2 343 455
3 767 545
上面读取的结果默认列名是0、1,如果我要设置一个列名给它怎么办呢:
>>> ca = pd.read_table("a.txt",sep='love',names=['start','end'],header=None)
>>> ca
start end
0 12 34
1 34 545
2 343 455
3 767 545
3、read_fwf
官方文档是这么说的:Read a table of fixed-width formatted lines into DataFrame
12 12 分享:

相关课程

发表评论

登录后才能评论,请登录后发表评论...
提交评论

最新文章