来做一个NLP任务

  步骤为:
    1.读取文件;
    2.去除所有标点符号和换行符,并把所有大写变成小写;
    3.合并相同的词,统计每个词出现的频率,并按照词频从大到小排序;
    4.将结果按行输出到文件 out.txt。
  代码:
import re
import os,sys
# 你不用太关心这个函数
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
      print(word_cnt.items())
  # 按照词频排序
  sorted_word_cnt = sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True)
  return sorted_word_cnt inFile = 'in.txt'
if not os.path.exists(inFile):
  print(f'file {inFile} not exist')
  sys.exit()
with open(inFile, 'r') as fin:
  text = fin.read() word_and_freq = parse(text) outFile = 'out.txt'
with open(outFile, 'w') as fout:
  for word, freq in word_and_freq:
    try:
      fout.write('{} {}\n'.format(word, freq))
    except Exception as ex:
      print(f"error in wirte {outFile},error msg:{ex}")
  假如文件非常大,一次性读取可能会导致内存崩溃,那么可以用一行一行读取的方法来实现:
from collections import defaultdict
import re,sys,os inFile = 'in.txt'
if not os.path.exists(inFile):
  print(f'file {inFile} not exist')
  sys.exit()
f = open(inFile, mode="r", encoding="utf-8")
word_cnt = defaultdict(int) #defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值 for line in f: #逐行读取
  line =re.sub(r'[^\w ]', '', line) #使用正则表达式去除标点符号和换行符
  for word in filter(None, line.split(' ')): #按空格把单词分组,并把空白单词去掉
    word_cnt[word] += 1 outFile = 'out.txt'
with open(outFile,'w') as fout:
  for word, freq in sorted(word_cnt.items(), key=lambda kv: kv[1], reverse=True):
    try:
      fout.write(f'{word} {freq}\n')
    except Exception as ex:
      print(f"error in wirte {outFile},error msg:{ex}")

  I/O需谨慎,所有I/O操作都应该进行错误处理,以防编码漏洞。

Json 序列化与反序列化

  json.dumps() 这个函数,接受 Python 的基本数据类型,然后将其序列化为 string;

  json.loads() 这个函数,接受一个合法字符串,然后将其反序列化为 Python 的基本数据类型。

  同样的,Json序列化与反序列化时也要注意做错误处理,比如json.loads('123.2')会返回一个float类型。因此反序列化后需要判断是否期望的类型:
original_params = json.loads(params_str)
t = type(original_params)
if t is not dict:
print(f'is {t} not dict')

  json.dumps() 与json.loads()例子:

import json,sys
params = {
'symbol': '',
'type': 'limit',
'price': 123.4,
'amount': 23
}
try:
params_str = json.dumps(params)
except Exception as ex:
print(f'error on dumps error msg:{ex}')
sys.exit() print('after json serialization')
print('type of params_str = {}, params_str = {}'.format(type(params_str), params))
#after json serialization
#type of params_str = <class 'str'>, params_str = {'symbol': '123456', 'type': 'limit', 'price': 123.4, 'amount': 23} original_params = json.loads(params_str)
t = type(original_params)
if t is not dict:
print(f'is {t} not dict')
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}

参考资料:

极客时间《Python核心技术与实战》

Python基础:输入与输出(I/O)的更多相关文章

  1. Python基础篇(格式化输出,运算符,编码):

    Python基础篇(格式化输出,运算符,编码): 格式化输出: 格式:print ( " 内容%s" %(变量)) 字符类型: %s  替换字符串      %d 替换整体数字  ...

  2. C#语言基础— 输入与输出

    C#语言基础— 输入与输出 1.1函数的四要素:名称.输入.输出.加工 1.2主函数:输出语句.输入语句: Static viod Main(string[] stgs)//下划线部分可以自己指定 { ...

  3. python 3 输入和输出

    一.普遍的输入和输出 1.输入 在python3中,函数的输入格式为:input(),能够接受一个标准输入数据,返回string类型. input() 函数是从键盘作为字符串读取数据,不论是否使用引号 ...

  4. python基础_格式化输出(%用法和format用法)(转载)

    python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...

  5. Python的输入和输出问题详解

    输出用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print('hello, world') pr ...

  6. Python学习——输入和输出

    (转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316434841 ...

  7. 2.Python基础认识(格式化输出,while语句,运算符,编码,单位转化)

    Python基础认识 1.字符串的格式化初识及占位符的简单应用 字符串的格式化 按照既定的要求进行有规定排版的一种输出方式. #我们想要输出的格式如下: ----------------------- ...

  8. python基础(5):格式化输出、基本运算符、编码问题

    1. 格式化输出 现在有以下需求,让⽤户输入name, age, job,hobby 然后输出如下所⽰: ------------ info of Alex Li ----------- Name : ...

  9. python文件输入和输出

    1.1文件对象 文件只是连续的字节序列.数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成.1.2文件内建函数open()和file() 内建函数open()的基本语法是: file_ ...

随机推荐

  1. CXF 发布rest服务

    1.1      什么是rest服务 REST 是一种软件架构模式,只是一种风格,rest服务采用HTTP 做传输协议,REST 对于HTTP 的利用实现精确的资源定位. Rest要求对资源定位更加准 ...

  2. 白话SpringCloud | 第零章:前言

    说在前面 大清早醒来,觉得睡不着了.还是起来,写写博客.但最后发现关于SpringBoot的安全相关的还是比较多内容的,也比较专业,怕是一个多小时完不成的,也罢,那就来写写关于SpringCloud前 ...

  3. .bak文件数据还原

    .bak文件还原(见下图) 1.连接上数据库,右键数据库,选择新建数据库,输入你要还原数据库的名称 2.数据库右键-->任务-->还原-->数据库,弹出窗口选择[源设备],选择.ba ...

  4. WPF自定义分页控件,样式自定义,简单易用

    WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...

  5. enable orgmode latex preview to support retina on mac

    Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...

  6. 渐进式jpeg(progressive jpeg)图片及其相关

    最近看有些网站上的jpg格式的图片在呈现的时候,有两种方式,一种是自上而下扫描式的,还有一种就是先是全部的模糊图片,然后逐渐清晰(就像GIF格式的交错显示). 一.基本JPEG(baseline jp ...

  7. Struts2笔记3--OGNL

    一.OGNL入门 1.简介     OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可以通过某 ...

  8. MySQL-5.6.30 (OpenLogic CentOS7.2)

    平台: CentOS 类型: 虚拟机镜像 软件包: centos7.2 mysql5.6.30 basic software database linux open source 服务优惠价: 按服务 ...

  9. vue-初识

    一:vue基础1.1.Vue是一套构建用户界面的渐进式框架1.2.引入vue:<script src="https://unpkg.com/vue/dist/vue.js"& ...

  10. linux 命令——56 netstat(转)

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...