python普通文件读取问题汇总

一、文件编码及转码的问题总结

Spyder中,在preference(小工具图标)-current working directory中,选择第一项,将工作路径选成当前文件的位置。日后需要读取文件,放在同一个文件夹即可,解决文件读取的路径问题。可以用以下两句确认一下:

import os

print(os.getcwd()) #获取当前路径

确认文件是否是utf-8格式,可以通过sublime这样的文本打开看,如果乱码,基本可以确定不是utf-8。

excel能够正确识别用gb2312、gbk、gb18030或utf_8 with BOM 编码的中文,如果是utf_8 no BOM编码的中文文件,excel打开会乱码。

一般情况下,文件的第一句就标出来了,#!/usr/bin/envpython3 # -*- coding: utf-8 -*-还是可以用以下:

#获取系统默认编码:

import sys

print(sys.getdefaultencoding()

在进行同时包含 str 与 unicode 的运算时,Python 一律都把 str 转换成unicode 再运算,当然,运算结果也都是 unicode。

二进制位叫做bit,是0和1这两种状态;八个bit可以组合256种状态,叫一个字节,byte。二进制转十六进制很方便,所以字节可以用两个十六进制数表示。一五一五二五六嘿嘿。

csv文档用的不是utf-8编码,这时候需要解码,涉及到各种码的情况。总结如下表。

Python3.X源码文件默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。

在python中有两种字符串类型,分别是 str 和unicode,在读取一个文件的内容,或者从网络上读取到内容时,保持的对象为str类型;如果想把一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等。

从unicode变成其他的编码,是encoding,因为是从每一个没有编码的东西,变成一个有编号的东西;从utf-8,gbk等转化成unicode,是decoding,因为是从一个有编码的东西让她变成没有的,de下去。

直接执行encode('gb2312'),Python 会自动的先将内容解码为 unicode,然后再编码成 gb2312。因为解码是python自动进行的,如果没有指明解码方式,python 就会使用sys.defaultencoding指明的方式来解码。很多情况下 sys.defaultencoding 是 ANSCII,如果 s 不是这个类型就会出错。但是!为什么我没有出现这个问题,因为在最开始,我们的Spyder已经在开头规定了utf-8,也就是明确指出了文件原来的编码方式。所以直接encoding就好了,但它的内在顺序是utf-8➡️unicode➡️gb2312。

如果按照这个逻辑,如果我前面指定utf-8,转码时候也写成utf-8,应该也可以吧?

file01=open('aaa.csv',encoding="utf-8"),会报错。

python中的print直接把字符串传递给操作系统,所以需要把str解码成与操作系统一致的格式。(mac格式是啥,不知道。反正大概是这个意思,累了。)

二、课堂上产生的叽歪需求探索

1.找到某个特殊字符的编码:先把它列出来看看在哪里,位置找到以后用ord输出。

l1=list(d.items())

print(ord(l1[26][0]))

2.如何给有两个元素的list写循环?

问题描述:把dic转成列表以后,会得到一个大列表,每个列表有两个元素(键[0]和值[1]),写一个循环,列出每一个键的编码,即直接对每一个键全部执行ord。

#%%整理结果

f1=open("ALICE.txt","r",encoding="gbk")

s=f1.read()

s=s.lower()

s=s.replace(i,"")

d={}

for ch in s:

d[ch]=d.get(ch,0)+1

print(d,len(d))

l1=list(d.items())

print(len(l1))

for i in range(27):

print("{}{:6}{:6}".format(l1[i][0],ord(l1[i][0]),l1[i][1]))

#找到那个奇怪字符的ord后,把它替换掉,然后排序

l1.sort(key=lambda x:x[1],reverse=True)

for i in range(26):

print("{}{:6}".format(l1[i][0],l1[i][1]))

怀疑自己是个天才或者傻子。临下课脑子不转了,为什么想在for 里面直接些 l1,换成range不就好了,避免它出现在for语句控制里,在循环的部分再写。感觉像高中数学题的套路。

三、正则表达式

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

廖老师博客给出判断是否为email的方法,假设要判断一个字符串是否是合法的“快递收件人信息”,步骤应该是:1.创建一个匹配“快递收件人信息”的正则表达式;2.用该正则表达式去匹配用户的输入,来判断是否合法。

如何用字符来表述字符呢?

比如我规定,快递收件人信息包括三块,“姓名”+“电话”+“地址”,这样就需要用字符来描述字符。在正则表达式中,如果直接给出字符,就是精确匹配。用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以:

·'00\d'可以匹配'007',但无法匹配'00A';

·'\d\d\d'可以匹配'010';

·'\w\w\d'可以匹配'py3';

·.可以匹配任意字符,所以:'py.'可以匹配'pyc'、'pyo'、'py!'等等。

·用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用表示n个字符,用表示n-m个字符:

4. 举个

\d\s+\d\s+\d这是一个3-4-4的电话号码

\d这是一个没空格的电话号码

A|B可以匹配A或B,所以(\d\s+\d\s+\d|\d)可以匹配去寄快递的人输入的两种电话,也许他只是直接粘贴的,会有空格(未必太thoughtful)。

^表示行的开头,^\d表示必须以数字开头。$表示行的结束,\d$表示必须以数字结束。

5.进阶

·要做更精确地匹配,可以用[]表示范围,比如:

·[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;

[0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','Py3000'等等;

·[a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下划线开头,后接任意个由一个数字、字母或者下划线组成的字符串,也就是Python合法的变量;

·[a-zA-Z\_][0-9a-zA-Z\_]更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。

6.正式的举例子

为了不考虑转义的问题,推荐使用python的r前缀。

s =r'ABC\-001'# Python的字符串

# 对应的正则表达式字符串不变:

# 'ABC\-001'

match()方法判断是否匹配,如果匹配成功,返回一个Match对象,否则返回None。常见的判断方法就是:

test ='用户输入的字符串'

ifre.match(r'正则表达式', test):

print('ok')

else:

print('failed')

先到这里了!!!贪婪表达式什么的下周再看吧!!!(and保留问题:怎么只有字母,没有中文,中文咋表示?)脑袋累晕了要脱发了!周日的悠闲下午已经贡献四个小时给python,必须出门放松一下了!我倒

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181104G12GUG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券