利用python进行数据分析:将数据写入文本,使用分隔格式,JSON 数据

6.1.2 将数据写入文本

使用dataframe 的 to_csv 方法。我们可以将数据导出为逗号分隔的文件:

data=pd.DataFrame({'qu1':[1,2,4,3,4],'qu2':[2,3,1,2,3],'qu3':[1,5,2,4,4]})
data.to_csv('out.csv')
!type out.csv
,qu1,qu2,qu3
0,1,2,1
1,2,3,5
2,4,1,2
3,3,2,4
4,4,3,4

data.to_csv('out.csv',sep='|')       # 指定别的分隔符
|qu1|qu2|qu3
0|1|2|1
1|2|3|5
2|4|1|2
3|3|2|4
4|4|3|4

data=pd.DataFrame({'qu1':[1,2,np.nan,3,4],'qu2':[2,3,1,2,3],'qu3':[1,5,2,4,4]})
data.to_csv('out.csv',na_rep='NULL')     # 默认的缺失值显示为空字符串,这里我们让其显示为 null 
,qu1,qu2,qu3
0,1.0,2,1
1,2.0,3,5
2,NULL,1,2
3,3.0,2,4
4,4.0,3,4

data.to_csv('out.csv',na_rep='NULL',index=False,header=False)
2.0,3,5              # 这里我们禁止了行和列标签的写入
NULL,1,2
3.0,2,4
4.0,3,4

data.to_csv('out.csv',na_rep='NULL',columns=['qu2','qu3'])     # 这里我们仅写入部分列,并按照我们想的顺序
,qu2,qu3
0,2,1
1,3,5
2,1,2
3,2,4
4,3,4

data['qu3'].to_csv('teseries.csv')       # Sries 也有 to_csv方法的

6.1.3 使用分隔格式

绝大多数表型数据都可以使用 read_table 读取,但是某些情况下我们还是需要些手操。

import csv

!type ex7.csv      # 我们使用这个 csv文件
"a","b","c"
"1","2","3"
"1","2","3"

reader=csv.reader(open('ex7.csv'))
for line in reader:
    print(line)
['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3']

# 然后我们进行一些处理,将数据整理成我们需要的形式
with open('ex7.csv') as f:
    lines=list(csv.reader(f))
    
header,values = lines[0],lines[1:] # 拆分成列名行和数据行
data_dict={h:v for h,v in zip(header,zip(*values))}   # *values 很少见啊。。
data_dict
{'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}

list(zip(*values))     # 加个* 就变成了参数集合,python自动展开成参数列表
[('1', '1'), ('2', '2'), ('3', '3')] # list(zip([1,2,3],[1,2,3])) 就是这个感觉

csv文件有多种不同的风格,如需要不同的分隔符,字符串引用约定或行终止符定义处一种新的格式,可以使用 cdv.Dialect 定义一个简单的子类。

class my_dialect(csv.Dialect):    # 额,,,这需要懂嘛。。。
    lineterminator = '\n'
    delimiter=';'
    quotechar='"'
    quoting = csv.QUOTE_MINIMAL

reader=csv.reader(f,dialect=my_dialect)


# 我们也可以不用定义子类,直接将CSV 方言参数传入 csv.reader 的关键字参数:
reader = csv.reader(f,delimiter='|')

在这里插入图片描述
然后就是 csv.writer 方法写入文件。。。

import csv

headers = ('name','age','height')
students = [
    ("张三",18,180),
    ("李四",19,190),
    ("王五",20,170)]
with open("students.csv",'w',encoding='utf-8',newline='') as fp: 
# csv标准库中的writerow在写入文件时会加入'\r\n'作为换行符,if newline is '',换行符不会被转化,就不会有额外的空行了。。。。
    writer = csv.writer(fp,dialect=my_dialect )      # 这个也接受方言、格式选项。。
    writer.writerow(headers)     # 写入表头
    writer.writerows(students)               # 写入数据


headers = ('name','age','height')
students = [
    {"name":"张三","age":18,"height":180},
    {"name":"李四","age":19,"height":190},
    {"name":"王五","age":20,"height":170}
]

with open("students.csv",'w',encoding='utf-8',newline='') as fp:       
    writer = csv.DictWriter(fp,headers)
    # 虽然DictWriter创建的时候有一个headers,但是想要写入数据进去,还是需要调用
    # writer.writeheader()方法,否则,表头数据写入不进去
    writer.writeheader()
    writer.writerows(students)

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"]}]
}
"""

JSON非常接近python 代码,除了他的空值 null 和一些其他的细微差别(例如不允许列表末尾的逗号)之外,基本类型就是对象(字典),数组(列表),字符串,数字,布尔值,和空值。对象中所有的键必须是字符串,我们使用 json 库来读写数据

import json
result = json.loads(obj)
result
{'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']}]}

asjson=json.dumps(result)       # 转会JSON 字符串

siblings=pd.DataFrame(result['siblings'],columns=['name','age'])
siblings          # 转换成 dataframe 
    name	age
0	Scott	30
1	Katie	38

!type example.json
[{"a": 1, "b": 2, "c": 3},
 {"a": 4, "b": 5, "c": 6},
 {"a": 7, "b": 8, "c": 9}]

data=pd.read_json('example.json')      # 自动将JSON 数据集按照指定次序转换成 series 或 dataframe
data
   a	b	c
0	1	2	3    # 默认是JSON 数组里的每个对象是表里的一行。
1	4	5	6
2	7	8	9

data.to_json()           # 将数据导出为JSON

爬虫没白学啊。。。。

猜你喜欢

转载自blog.csdn.net/weixin_46192930/article/details/106577472