第四节-Python文件操作

                    讨论主题
习题1、
将 PPT 中 iris_data.csv 读取例子中不完美的两个部分完善
a. 存储数字数据的类型由字符串改成 float 或 int;
b. 使 data 中不包含最后一行空行。

strip( )方法   :用于移除字符串头尾指定的字符(默认为空格),用法

str.strip([chars]);

返回移除字符串头尾指定的字符生成的新字符串。eg:
str = "0000000   Runoob   0000000"
print (str.strip( '0' ))    # 去除首尾字符 0 
str2 = "    Runoob    "       # 去除首尾空格 
print (str2.strip())
>>
   Runoob   
Runoob
split( ) 通过指定分隔符对字符串进行切片
str.split(str="", num=string.count(str))
  • str -- 分隔符,默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。
  • num -- 分割次数。
str = "Line1-abcdef \nLine2-abc \nLine4-abcd"
print (str.split( ))
print (str.split(' ', 1 ))
>>
['Line1-abcdef', 'Line2-abc', 'Line4-abcd']
['Line1-abcdef', '\nLine2-abc \nLine4-abcd']
enumerate( )函数   : 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标;
enumerate(sequence, [start=0])
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] 
>>> list(enumerate(seasons, start=1)) # 小标从 1 开始 
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
这里实现取出下标索引
data = []
with open ( '.././data/iris_data.csv' , 'r' ) as file_in :
    for i in file_in :
        # 消除最后一行空行
        if i != ' \n ' :
            # 使用切片并不取逗号
            data. append ((i[ :- 1 ]). split ( ',' ))
print (data)

# 转换数据类型
for line in data :
    for ide , cell in enumerate (line[ :- 1 ]) :
l        ine[ide] = float (cell)
print (data)
>>
[['5.1', '3.5', '1.4', '0.2', 'Iris-setosa'],
[[5.1, 3.5, 1.4, 0.2, 'Iris-setosa'],

习题2、 
读取文件 iris_data.csv 中的数据并变形为一个字典,
字典的 key 是花朵的英文名, value 是对应的4个浮点数数值。如
{
"Iris-setosa": [4.9,3.1,1.5,0.1],
"...": [...],
...
}
字典的增加:
dict["key"] = "value"
data = []
with open ( '.././data/iris_data.csv' , 'r' ) as file_in :
    for i in file_in :
        # 消除最后一行空行
        if i != ' \n ' :
            # 使用切片并不取逗号
            data. append ((i[ :- 1 ]). split ( ',' ))
print (data)

# 转换数据类型
data_dict = {}
for line in data :
    for ide , cell in enumerate (line[ :- 1 ]) :
        line[ide] = float (cell)
# print(data)
# 写入字典
    data_dict[line[ - 1 ]] = line[ :- 1 ]
print (data_dict)
>>
{'Iris-setosa': [5.0, 3.3, 1.4, 0.2], 'Iris-versicolor': 

习题3、
假设习题2中的四个数字对应的名字为: a, b, c, d
构造一个嵌套的字典存储花朵的信息, 并存为 json 文件.
{
"Iris-setosa": {
                         "a": 4.9,
                         "b": 3.1,
                         "c": 1.5,
                         "d": 0.1
                      },
...
}
#习题3、字典嵌套,并生成.json文件
data = []
with open('.././data/iris_data.csv','r') as file_in:
    for i in file_in:
        #消除最后一行空行
        if i != '\n':
            #使用切片并不取逗号
            data.append((i[:-1]).split(','))
print(data)

#转换数据类型
data_dict = {}
data_dict_ins = {}
for line in data:
    for ide,cell in enumerate(line[:-1]):
        line[ide] = float(cell)
        data_dict_ins['a'] = line[0]
        data_dict_ins['b'] = line[1]
        data_dict_ins['c'] = line[2]
        data_dict_ins['d'] = line[3]
        #另一种实现方式
        # data_dict_ins[line[-1]] = dict(a=line[0],b=line[1],c=line[2],d=line[3])
    #写入字典,注意!因为key有可能重复,要区分
    data_dict[line[-1]+'-'+str(data.index(line))] = data_dict_ins
print(data_dict)
#存储为.json文件
import json

with open("L-output/output-1.json","w") as file_out:
    json.dump(data_dict,file_out,indent=4)
>>
{'Iris-setosa-0': {'a': 5.9, 'b': 3.0, 'c': 5.1, 'd': 1.8}, 'Iris-setosa-1': {
output.json
{
    "Iris-setosa-0": {
        "a": 5.9,
        "b": 3.0,
        "c": 5.1,
        "d": 1.8
    },
    "Iris-setosa-1": {
        "a": 5.9,
        "b": 3.0,
        "c": 5.1,
        "d": 1.8
    },
    "Iris-setosa-2": {
        "a": 5.9,
        "b": 3.0,
        "c": 5.1,
        "d": 1.8
    },
2、
open 模式:
w 以写方式打开,
a 以追加模式打开 
r+ 以读写模式打开
w+ 以读写模式打开 
a+ 以读写模式打开 
rb 以二进制读模式打开
wb 以二进制写模式打开 
ab 以二进制追加模式打开 
rb+ 以二进制读写模式打开 
wb+ 以二进制读写模式打开 
ab+ 以二进制读写模式打开
w+是打开后,清空原有内容,成为一个新的空文件,对这个空文件具有读写权限。
r+是打开后,可以读取文件内容吧,保存原有内容,追加写内容,写动作则是追加的新内容。
5、
10、
writelines() 方法用于向文件中写入一序列的字符串。
这一序列字符串可以是由迭代对象产生的,如一个字符串列表。
换行需要制定换行符 \n
write(str)的参数是一个字符串,就是你要写入文件的内容.
writelines(sequence)的参数是 字符序列,比如列表
fileObject.writelines( [ str ])
# 打开文件
fo = open("test.txt", "w")
print ("文件名为: ", fo.name)
seq = ["菜鸟教程 1\n", "菜鸟教程 2"]
fo.writelines( seq )

# 关闭文件
fo.close()

猜你喜欢

转载自blog.csdn.net/sdhotn/article/details/80323337