文本数据的读取

  • 读取文件操作

df = pd.read_csv(‘examples/ex1.csv’) # 读取.csv文件输出一个DataFrame
pd.read_table(‘examples/ex1.csv’, sep=‘,’) # 用read_table并指定分隔符(sep)

  • 列名的命名

pd.read_csv(‘examples/ex2.csv’, header=None) # 默认pandas分配列名
pd.read_csv(‘examples/ex2.csv’, names=[‘a’, ‘b’, ‘c’, ‘d’, ‘names’]) # 自己定义列名names=[‘’]

  • 使用参数index_col来具体指定对象的某一列作为新对象的索引

pd.read_csv(‘examples/ex2.csv’, names=names, index_col=‘names’)

  • 将多个列做成一个层次化索引,只需传入由列编号或列名组成的列表

#就是将多行相同名字划分为同一个索引名中
df = pd.read_csv(‘examples/csv_mindex.csv’, index_col=[‘key1’, ‘key2’])

  • 手动调数据规整,使用read_table(‘文件’, sep=‘按照正则表达式(元字符)作为分隔符’)

df = pd.read_table(‘examples/ex3.txt’, sep=‘\s+’)

  • 种各样的异形文件格式,使用skiprows跳过文件的某些不要输出的行

pd.read_csv(‘examples/ex4.csv’, skiprows=[0, 2, 3])

  • 查询是否为数据缺失使用isnull(true为缺失值)

df = pd.read_csv(‘examples/ex5.csv’)
pd.isnull(df)

  • na_values可以用一个列表或集合的字符串表示缺失值

df = pd.read_csv(‘examples/ex5.csv’, na_values=[‘NULL’])

  • 用字典把各列中某些值用NaN来标记

dict = {‘message’: [‘foo’], ‘something’: [‘one’, ‘NA’]} # ‘列名’:[‘值’, ‘NA可加可不加’]
df = pd.read_csv(‘examples/ex5.csv’, na_values=dict)

1.逐块读取文本文件
  • 面对很大的文件时,只想读取文件的一小部分或者是逐块对文件进行迭代

#先设置pandas显示地更紧一些

pd.options.display.max_rows = 10

#只想读取几行(避免读取全部),直接通过nrows=xx来指定读取几行数据(按照顺序读取)

pd.read_csv(‘examples/ex6.csv’, nrows=4)

#逐块读取文件,可以指定chunksize(行数)

chunker = pd.read_csv(‘examples/ex6.csv’, chunksize=1000)
#chunker
#read_csv所返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代
t1 = pd.Series([])
for piece in chunker:
t1 = t1.add(piece[‘key’].value_counts(), fill_value=0) # 迭代处理ex6.csv,将值计数聚合到"key"列中
t1 = t1.sort_values(ascending=False)

将数据写到文本中
  • 数据也可以被输出为分隔符格式的文本
  • DataFrame中to_csv()方法的使用

data.to_csv(‘examples/out.csv’) #DataFrame方法to_csv()可以将数据写入out.csv文件中
import sys
data.to_csv(sys.stdout, sep=‘/’) #数据直接写入到sys.stdout,所以输出结果是文本结果
data.to_csv(sys.stdout, na_rep=‘NULL’) #缺失值输出为na_rep=‘NULL’(或者是其它字符、数字)
#可以设置行和列的标签或者是禁用

data.to_csv(sys.stdout, index=False, header=False) # 行和列索引标签禁用
data.to_csv(sys.stdout, index=False, columns=[‘a’, ‘b’,‘c’], na_rep=‘NULL’) # 输出部分列并且可以按照自己规定的顺序

  • Series中to_csv()方法的使用
dates = pd.date_range('1/1/2000', periods=7)
ts = pd.Series(np.arange(7), index=dates)
ts.to_csv('examples/tseries.csv')
data = pd.read_csv('examples/tseries.csv')
print(data)
处理分隔符的格式要求

CSV以纯文本存储数和文本。文件的每一行就代表一条数据,每条记录包含由逗号分隔一个或多个属性值。

1) 默认读写用逗号做分隔符(delimiter),双引号作引用符(quotechar)
2) 用writer写数据None被写成空字符串,浮点型调用repr()转化成字符串。非字符串型数据被str()成字符串存储。
3) open函数
   open('some.csv', newline='', encoding='utf-8')
   # 系统默认的编码为unicode)(将文件编码为unicode),同时可使用不同的编码解码文件
   # 如果newline=''没有指定,引用字段的换行符将不会被正确解释
  • reader迭代产生元组(每行产生一个元组并移除每条记录的引号)
import csv
f = open('examples/ex7.csv')
reader = csv.reader(f) # 将任意打开的文件或文件型的对象传给csv.reader
for i in reader:
    print(i) #reader进行迭代将会为每行产生一个元组并输出

输出为
[‘a’, ‘b’, ‘c’]
[‘1’, ‘2’, ‘3’]
[‘1’, ‘2’, ‘3’]

  • 为了进一步使数据格式符合要求,按照要求输出所求的字典
with open('examples/ex7.csv') as f:
    List = list(csv.reader(f)) # 读取文件到一个多行的列表(元组、字典等)中
    # print(List)
header, values = list[0], list[1:] # 将这些行划分为标题行和数据行
data_dict = {h: v for h, v in zip(header, zip(*values))}
print(data_dict)

输出为
{‘a’: (‘1’, ‘1’), ‘b’: (‘2’, ‘2’), ‘c’: (‘3’, ‘3’)}

  • zip()函数的用法
    参数iterable为可迭代的对象,可以有多个参数。函数返回的是一个以元组为元素的列表,其中第 i 个元组中包含每个参数序列的第 i 个元素。当只有一个序列参数时,它返回一个1元组的列表。当没有参数时,它返回一个空的列表。
import numpy as np
a=[1,2,3]
b=[4,5,6]
c=[7,8,9]
tuple_zip = zip(a, b, c)
tuple_zip1 = zip()  # 没有参数
tuple_zip2 = zip(a)  # 只有一个序列参数
x, y, z = zip(*tuple_zip)  # zip() 和 * 操作符一起操作可以用来 unzip 一个列表
print(tuple_zip)
print(tuple_zip1)
print(tuple_zip2)
print(x)
print(y)
print(z)
# 输出为
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
[]
[(1,), (2,), (3,)]
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
  • csv文件格式
# 方法1:定义csv.Dialect的一个子类(如专门的分隔符、字符串引用约定、行结束符等) : 
class my_dialect(csv.Dialect):
    lineterminator = '\n'
    delimiter = ';'
    quotechar = '"'
    quoting = csv.QUOTE_MINIMAL   
    
reader = csv. reader (f , diaect=my_dialect)
    
# 方法2:各个csv方法的参数以关键字的形式提供给csv.reader :   
reader= csv.reader(f, delimiter='|') 
参数 说明
delimiter 用于分隔字段的单字符字符串。默认为","
lineterminator 用于写操作的行结束符,默认为“'\r\n ’ 。读操作将忽略此选项,它能认出跨平台的行结束符
quotechar 用于带有特殊字符(如分隔符)的字段的引用符号。默认为’ " ’
quoting 引用约定。可选值包括csv.QUOTE _ ALL (引用用所有字段)
csv.QUOTE_MINIMAL(引用如分隔符之类特殊字符的字段)默认
csv.QUOTE_NONNUMERIC
cvsv.QUOTE_NON (不引用)
skipinitialspace 忽略分隔符后面的空白符。默认为False
doublequote 如何处理字段内的引用符号。如果为True ,则双写。
escapechar 用于对分隔符进行转义的字符串(如quoting=csv.QUOTE_NONE默认禁用
JSON数据

JSON(JavaScript Object Notation的简称)已经成为通过HTTP请求在Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格型文本格式(如CSV)灵活得多的数据格式。并且允许有空值(null)和末尾不允许存在多余逗号等,对象中所有的键都必须是字符串。

# 创建一个JSON
obj = """
{"name": "Wes",
 "places_lived": ["United States", "Spain", "Germany"],
 "pet": null,
 "siblings": [{"name": "Scott", "age": 30, "pets": ["Zeus", "Zuko"]},
              {"name": "Katie", "age": 38,
               "pets": ["Sixes", "Stache", "Cisco"]}]
}
"""
# 1)用json.loads来将将JSON字符串转换成Python形式
import json
Python_json = json.loads(obj)
Python_json
# 输出为
{'name': 'Wes',
 'places_lived': ['United States', 'Spain', 'Germany'],
 'pet': None,
 'siblings': [{'name': 'Scott', 'age': 30, 'pets': ['Zeus', 'Zuko']},
  {'name': 'Katie', 'age': 38, 'pets': ['Sixes', 'Stache', 'Cisco']}]}

# 2)用json.dumps来将Python对象转换成JSON格式 
json_python = json.dumps(Python_json)

# 3)将一组或一个JSON对象转换为DataFRame或Series便于数据分析
DataFRame_Json = pd.DataFrame(result['siblings'], columns=['name', 'age'])  
# result['siblings']是向DataFrame传入一个字典的列表(就是原先的JSON对象),columns是来选取JSON数据字段的子集
DataFRame_Json 
#输出为
   name  age
0  Scott   30
1  Katie   38

# 4)pd.read_json可以自动将特别格式的JSON数据集转换为Series或DataFrame 
# example.json为
[{"a": 1, "b": 2, "c": 3},
 {"a": 4, "b": 5, "c": 6},
 {"a": 7, "b": 8, "c": 9}]
data = pd.read_json('examples/example.json')
data
# 输出为
  a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

# 5)将数据从pandas输出到JSON是要to_json方法
data.to_json() 
data.to_json(orient='records')  # 以列表输出,列表以字典为元素输出
# 输出为
{"a":{"0":1,"1":4,"2":7},"b":{"0":2,"1":5,"2":8},"c":{"0":3,"1":6,"2":9}}
[{"a":1,"b":2,"c":3},{"a":4,"b":5,"c":6},{"a":7,"b":8,"c":9}]
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐