Chapter04 python输入输出-文件读取

文章目录

  • 前言
  • 输入输出的基础
  • 文件读写
  • JSON文件格式


前言

在互联网上,没人知道你是狗。

现在的我们其实都是通过网线与这个世界交互连接,你通过键盘与网线另一头的“人”互通消息。

程序也一样,我们可以通过输入输出流将处理后的数据送出。

输入输出的基础

name = input('please input your name: ')
age = input('please input your age: ')
控制台:
please input your name: Tom
please input your age: 18
name = input('please input your name: ')
gender = input("please input your choice:(y or n)  ")
_str = '{name} chose {prefix}.'
_dic = {
    'prefix': 'yes' if gender == 'y' else 'no',
    'name': name
}
print('waiting...')
print(_str.format(**_dic))
控制台:
please input your name: tom
please input your choice:(y or n)  y
waiting...
tom chose yes.

input()函数暂停程序运行,同时等待键盘输入;直到回车被按下,函数的参数即为提示语,输入的类型则是字符串型。但是print()函数接受的类型很多,比如字符串、数字、字典、列表甚至是一些自定义的输出。

n1 = input('n1: ')
n2 = input('n2: ')
print(n1 + n2)
print(type(n1+n2))
print(int(n1) + int(n2))
print(type(int(n1) + int(n2)))
控制台:
n1: 11
n2: 22
1122
<class 'str'>
33
<class 'int'>

这里我们可以把输入的字符类型转为整型(int)。但是注意在生产环境中,如果我们要使用强制转换时,记住要加上异常处理(后面会讲)。

看起来,输入输出很简单,但是我们一定要慎重,尤其是像涉及到边界条件的,因为很多的安全漏洞都是来自随意的I/O处理,历史上的安全事件大家可以百度了解一下。

文件读写

人工智能的入口就是文件读写。其实在生产级的python代码中,大部分的I/O则都是来自文本文件的读写。
这里我们定义一个文本文件,demo.txt。
内容如下;

1、Do one thing at a time, and do well.  
一次只做一件事,做到最好!  
2、Never forget to say “thanks”.  
永远不要忘了说“谢谢”!  
3、Keep on going never give up.  
勇往直前,决不放弃!  
4、Whatever is worth doing is worth doing well.  
任何值得做的事就值得把它做好!
import collections
import re

def parse(text):
    text = re.sub(r'[^\w]', ' ', text)   # 使用正则表达式去除标点符号和换行符
    text = text.lower()  # 转为小写
    word_ls = text.split(' ')
    word_ls = filter(None, word_ls)
    word_cnt = collections.Counter(word_ls)
    sorted_word_cnt = sorted(word_cnt.items(), key=lambda  x:x[1], reverse=True)
    return sorted_word_cnt

with open('demo.txt', 'r', encoding='UTF-8') as f:
    text = f.read()

word_dic = parse(text)
with open('out.txt', 'w', encoding='UTF-8') as f:
    for word, freq in word_dic:
        f.write('{} {}\n'.format(word, freq))
out.txt
do 2
well 2
never 2
is 2
worth 2
doing 2
1 1
one 1
thing 1
at 1
a 1
time 1
and 1
一次只做一件事 1
做到最好 1
2 1
forget 1
to 1
say 1
thanks 1
永远不要忘了说 1
谢谢 1
3 1
keep 1
on 1
going 1
give 1
up 1
勇往直前 1
决不放弃 1
4 1
whatever 1
任何值得做的事就值得把它做好 1

因为这里面有部分时中文,如果想要对中文分词可以考虑用结巴库。
parse()函数暂时不用关心,只需要知道它可以将输入的text文本字符串,做词频统计。

重点是我们要了解,计算机中文件访问的基础知识。
计算机内核对我呢见的处理相对比较复杂,涉及到内核模式、虚拟文件系统、锁和指针等一些列内容。

open()函数拿到文件的指针。其中第一个参数指定文件位置(相对位置和绝对位置);第二个参数,如果是‘r’,表示读取;如果是‘w’则表示写入;如果是‘rw’,则表示读写,还有一个是‘a’,表示追加写入。

在拿到指针后,我们可以通过read()函数,来读取文件的全部内容。代码text=f.read(),即表示把文件所有内容读取到内存中,并赋值给变量text。这样做存在个问题就是,如果文件过大,一次性读取可能造成内存崩溃。
所以在文本处理中,我们也可以通过readline()函数,每次读取一行。如果每行之间没有关联,这种做法也可以降低内存的压力。而write()函数,可以把参数中的字符串输出到文件中。

这里给大家留个思考问题,每次打开文件后,是否需要close文件?

JSON文件格式

JSON是一种轻量级的数据交换格式,它把所有事情都用设计的字符串来表示,这样既方便在互联网上传递信息,也方便人们进行阅读。JSON在当今互联网中应用非常广泛,在生产中,我们可以用json文件来存配置信息。所以每一个python工作者都要掌握这一技能。

import json

params = {
    'id': 123456,
    'pass_word': 123456,
    'task_type': 'sys setting',
    'limit': None
}
print(params)
print(type(params))
params_str = json.dumps(params)
print(params_str)
print(type(params_str))
params_load = json.loads(params_str)
print(params_load)
print(type(params_load))
控制台:
{'id': 123456, 'pass_word': 123456, 'task_type': 'sys setting', 'limit': None}
<class 'dict'>
{"id": 123456, "pass_word": 123456, "task_type": "sys setting", "limit": null}
<class 'str'>
{'id': 123456, 'pass_word': 123456, 'task_type': 'sys setting', 'limit': None}
<class 'dict'>
  • json.dumps(),接受python的基本数据类型,然后将它们序列化为string;
  • json.loads(),接受一个合法字符串,然后将其反序列化为python的基本数据类型。

当然,我们呢也可以从文件中读取JSON文件。

import json

params = {
    'id': 123456,
    'pass_word': 123456,
    'task_type': 'sys setting',
    'limit': None
}
# 将配置写入json文件
with open('params.json', 'w') as f:
    params_str = json.dump(params, f)
# 从文件中读取配置
with open('params.json', 'r') as f:
    params_dic = json.load(f)

print(params_dic)
控制台:
{'id': 123456, 'pass_word': 123456, 'task_type': 'sys setting', 'limit': None}

当你在使用配置文件时,可以通过json将用户的个人配置输出到文件,方便程序读取。

本章我们了解python的I/O,以及JSON的基本知识。在进行I/O操作时,一定要进行充分的错误处理,避免出现编程漏洞。

你可能感兴趣的:(python,开发语言)