python系列 - 输入和输出
输入输出基础
最简单的输入输出来源于键盘操作
name = input('your name:')
gender = input('you are a boy?(y/n)')
###### 输入 ######
your name:Jack
you are a boy?
welcome_str = 'Welcome to the matrix {prefix} {name}.'
welcome_dic = {
'prefix': 'Mr.' if gender == 'y' else 'Mrs',
'name': name
}
print('authorizing...')
print(welcome_str.format(**welcome_dic))
########## 输出 ##########
authorizing...
Welcome to the matrix Mr. Jack.
input()
会暂停函数运行,同时等待键盘输入,直到回车键被按下,参与内容即为提示语;输入的类型永远是字符串型str()
a = input()
1
b = input()
2
print('a + b = {}'.format(a + b))
########## 输出 ##############
a + b = 12
print('type of a is {}, type of b is {}'.format(type(a), type(b)))
########## 输出 ##############
type of a is <class 'str'>, type of b is <class 'str'>
print('a + b = {}'.format(int(a) + int(b)))
########## 输出 ##############
a + b = 3
👻👻👻ATTENTION:
将str强制转换成int,再进行计算
进行强制转换时,最好加上异常处理机制try except
文件输入输出
比如:统计一个txt文本内每个单词出现的频率,并按照次频从大到小排列
import re
# 你不用太关心这个函数
def parse(text):
# 使用正则表达式去除标点符号和换行符
text = re.sub(r'[^\w ]', ' ', text)
# 转为小写
text = text.lower()
# 生成所有单词的列表
word_list = text.split(' ')
# 去除空白单词
word_list = filter(None, word_list)
# 生成单词和词频的字典
word_cnt = {}
for word in word_list:
if word not in word_cnt:
word_cnt[word] = 0
word_cnt[word] += 1
# 按照词频排序
sorted_word_cnt = sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True)
return sorted_word_cnt
with open('words.txt', 'r') as fin:
text = fin.read()
word_and_freq = parse(text)
with open('out.txt', 'w') as fout:
for word, freq in word_and_freq:
fout.write('{} {}\n'.format(word, freq))
运行结果:生成out.txt
文件,文件内容如下(只截取了一部分):
通过上面的例子,可以了解到,python文件操作可以分为以下几步:
STEP1:需要先用open()
函数拿到文件的指针(第一个参数指定文件位置,第二个参数表示权限)
👻👻👻ATTENTION:
常用文件权限
r——读取
w——写入
rw——读写
a——追加(这样打开的文件,如果需要写入,会从原始文件的末位开始写入)
STEP2:通过read()
读取文件全部内容,并将需要的内容写入到新文件中
代码中text = fin.read()
表示把所有文件内容读取到内存中并赋值
👻👻👻ATTENTION:
优点:方便调用
缺点:文件过大,一次性读取可能会造成内存崩溃
解决方案:
- 给r
read()
指定参数size,用来表示读取的最大长度 - 通过
readline()
,每次读取一行
👻👻👻TIPS:
write()
表示写入
STEP3:关闭文件
open()
对应close()
,通常情况下,若打开文件,那么在完成读取后,应该like关掉文件(使用close)
但上述例子中,关闭文件并没有使用close()
,这里需要注意:如果使用了**with()**
语句,就不需要显式调用**close()**
,因为在with执行完毕后,close()
函数会自动被调用
注意:所有的I/O都应该有错误处理!!!
JSON序列化
json.dumps()
:接收python的基本数据类型,然后将其序列化为string(存储)
json.loads()
:接收一个合法字符串,然后将其反序列化为python的基本数据类型 (读取)
import json
params = {
'symbol':'123456',
'type':'limit',
'price':123.4,
'amount':23
}
params_str = json.dumps(params)
print(type(params_str),params)
original_params = json.loads(params_str)
print(type(original_params), original_params)
运行结果如下:
那么json文件的读取:
import json
params = {
'symbol': '123456',
'type': 'limit',
'price': 123.4,
'amount': 23
}
with open('params.json', 'w') as fout:
params_str = json.dump(params, fout)
with open('params.json', 'r') as fin:
original_params = json.load(fin)
print('after json deserialization')
print('type of original_params = {}, original_params = {}'.format(type(original_params), original_params))
########## 输出 ##########
after json deserialization
type of original_params = <class 'dict'>, original_params = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23}