pythonru
⑴ python文件中的词
本文实例讲述了Python3处理文件中每个词的方法。分享给大家供大家参考。具体实现方法如下:
CreatedonDec21,2012
处理文件中的每个词
@author:liury_lab
'''
importcodecs
the_file=codecs.open('d:/text.txt','rU','UTF-8')
forlineinthe_file:
forwordinline.split():
print(word,end="|")
the_file.close()
#若词的定义有变,可使用正则表达式
#如词被定义为数字字母,连字符或单引号构成的序列
importre
the_file=codecs.open('d:/text.txt','rU','UTF-8')
print()
print('************************************************************************')
re_word=re.compile('[w'-]+')
forlineinthe_file:
forwordinre_word.finditer(line):
print(word.group(0),end="|")
the_file.close()
#封装成迭代器
defwords_of_file(file_path,line_to_words=str.split):
the_file=codecs.open('d:/text.txt','rU','UTF-8')
forlineinthe_file:
forwordinline_to_words(line):
yieldword
the_file.close()
print()
print('************************************************************************')
forwordinwords_of_file('d:/text.txt'):
print(word,end='|')
defwords_by_re(file_path,repattern='[w'-]+'):
the_file=codecs.open('d:/text.txt','rU','UTF-8')
re_word=re.compile('[w'-]+')
defline_to_words(line):
formoinre_word.finditer(line):
yieldmo.group(0)#原书为return,发现结果不对,改为yield
returnwords_of_file(file_path,line_to_words)
print()
print('************************************************************************')
forwordinwords_by_re('d:/text.txt'):
print(word,end='|')
希望能帮到你!
⑵ python一段小函数解释
一般我们常见来的网址自后缀(suffix)是 cn,或者net,或者com,你说的就是域名的后缀列表
后面代码就是用dot把域名分隔开,
比如www..com 被拆分成[ ‘www','','com']
经过for循环后,到com的时候,进入if分支,而前面走的是else分支,所以可以看到sdomain的变化如下:
遇到www, sdomain包含['www']
遇到 sdomain被替换为['']
遇到com,走if分支,append,变成 ['','com']
然后join后就变成 .com
不过不知道这么些的理由,要是我,就用正则表达式,或者直接保留后面两个部分
domain=url.split('.')
if domain[-1] in suffixs:
return string.join(domain[-2:],'.')
else:
return None #not valid domain
⑶ python怎么读取TXT
Python的文本处理是经常碰到的一个问题,Python的文本文件的内容读取中,有三类方法:read()、readline()、readlines(),这三种方法各有利弊,下面逐一介绍其使用方法和利弊。
read():
read()是最简单的一种方法,一次性读取文件的所有内容放在一个大字符串中,即存在内存中
file_object = open('test.txt') //不要把open放在try中,以防止打开失败,那么就不用关闭了try:
file_context = file_object.read() //file_context是一个string,读取完后,就失去了对test.txt的文件引用
# file_context = open(file).read().splitlines()
// file_context是一个list,每行文本内容是list中的一个元素finally:
file_object.close()//除了以上方法,也可用with、contextlib都可以打开文件,且自动关闭文件,//以防止打开的文件对象未关闭而占用内存read()的利端:
方便、简单
一次性独读出文件放在一个大字符串中,速度最快
read()的弊端:
文件过大的时候,占用内存会过大
readline()逐行读取文本,结果是一个list
with open(file) as f: line = f.readline() while line:
print line
line = f.readline()readline()的利端:
占用内存小,逐行读取
readline()的弊端:
由于是逐行读取,速度比较慢
**readlines()一次性读取文本的所有内容,结果是一个list
with open(file) as f: for line in f.readlines():
print line这种方法读取的文本内容,每行文本末尾都会带一个' '换行符 (可以使用L.rstrip(' ')去掉换行符)
readlines()的利端:
一次性读取文本内容,速度比较快
readlines()的弊端:
随着文本的增大,占用内存会越来越多
- file_object = open('test.txt','rU')try:
- for line in file_object:
- do_somthing_with(line)//line带" "finally:
- file_object.close()
readline():
readlines():
最简单、最快速的逐行处理文本的方法:直接for循环文件对象
⑷ python for循环的问题
if shuru == 'Y' or shuru == 'y':
...
elif shuru == 'N' or shuru == 'n':
...
不能只if ... or 'xxx'
后面这个等于直接if一个字符串,直接判定为true.
⑸ Python定义函数的时候,加不加括号一样吗 比如,class Ru(): 和class Ru:
def才是定义函数的关键字吧,
class是定义类的关键字。因为默认继承object类,所以两种一样。如果要继承别的类就需要括号的。
⑹ Python3中反斜杠\n
由复r开头引起的字符串就是声明了后制面引号里的东西是原始字符串,在里面放任何字符都表示该字符的原始含义。
这种方法在做网站设置和网站目录结构的时候非常有用,使用了原始字符串就不需要转义了。
如果把单引号前边的r去掉的话就可以换行了
⑺ Python反斜杠小问题
原因很简单。runoob只输出runoob的原因是run[o]ob中的o并不是一个语法类型。
其次,ru oob中ru[ ]oob的 有一个换行的意思,所以结果是:
1-[ru
2-oob]
如果不想让他换行,可以使用/。
类似于 (换行)的还有 (字符串制中)和 (这个还没了解可以试验一下)
都可以试试看看效果。
⑻ 如何用python在Windows系统下,生成UNIX格式文件
平时测试工作中,少不了制造测试数据。最近一个项目,我就需要制造一批可在UNIX下正确读取的文件。为确保这批文件能从FTP下载成功,开发叮嘱我:“文件中凡是遇到换行,换行符必须是UNIX下的LF,而不是Dos\Windows下的CRLF。”
换行,在普通文档编辑中,就是按下“Enter”键。在编写代码时,就是在文件中写入字符串”\n”。但用python命令w在文件写入换行”\n”以后,由于是Windows系统的原故,会默认把”\n”实际保存为”\r\n”。
对于Windows下为何是”\r\n”,这里引用网上的解释:因为Windows采用了传统的英文打字机模式,它在换行时需分解成两步——回车”\r”和换行”\n”。回车(carriage return,CR)是将小车退回至起点,相当于把光标从行尾切换到行首,换行(line feed,LF)是将小车切换到下一行,这样的组合操作就完成了另起一行的目的。
我们首先确认Windows下的换行是否真的是CRLF:把文件用任意一款文本编辑器(以Notepad++为例)打开,在编辑器的菜单栏中,找到“视图”菜单,点击“显示符号”,勾选“显示所有字符”,就可以显示换行符了。我们在下图中可以看到,在Windows系统下,文件中的换行符确实是CRLF。
如何把CRLF变成LF呢?开发给出了一个解决方案。
Method A:
在Notepad++界面右下角,双击当前文件格式的描述:“Dos\Windows”,点击弹框中的“转换为UNIX格式”,最后保存文件。此时可以看到文件每行结尾都已经展示为“LF”了。
虽然整个转换过程极为简单,但要是有一大批这样的文件需要一个个手动转换,我不禁感慨光(xīn)阴(hǎo)虚(lèi)度,韶(bù)光(xiǎng)易(dòng)逝。
在表达抗议后,开发表示可以优化此方法,即使用文本编辑器的替换功能:
Method B:
使用Notepad++打开原文件,按下组合键Ctrl+F后,在弹框中选择“替换”栏,在“查找目标”输入框填写“\r\n”,“替换为”输入框填写“\n”,“查找模式”选择“扩展(\n\r\t\0\x...)”,点击“替换所有打开文件”后,一一保存文件即可。
然而把所有的文件保存一遍,并不能提升测试的幸福感。我追求的是尽量减少重复而繁重的手工劳动,解放双手,高效测试!类似这样的能力瓶颈,从我进入测试行业开始,就不断挤占着我的业余时间。为了更好的提高自己,系统地学习测试开发所必需的技能,我报名参加了吴老的测试开发培训班。
截至目前,吴老已经授课两个多月,我从无到有,学习了很多基本的python开发知识,也偶尔能接触到一些巧妙的编程思维。正好这次的数据准备,给我提供了一个实践的契机,让我运用最近学习的文件操作知识,体验了一次局部自动化的乐趣。
下面给大家分享一下我这次愉快的实践内容,由于真实的测试数据略有复杂,这里就用简单的两行数字来举个栗子。
首先按上课所讲的内容,依葫芦画瓢,使用Notepad++创建文件并写入文本内容:
1 #coding:utf-8(设定文件编码格式)
2 import os
3 import time
4
5 #切换到创建文件目录
6 os.chdir(r"C:\Study\Chestnuts\01data")
7
8 #新建创建文件函数
9 def create_file():
10
11 #构造文件名:以“年月日”为文件名的.dat文件
12 t=time.localtime()
13 file_name=time.strftime("%Y-%m-%d",t)+".dat"
14 #创建并打开文件
15 fp=open(file_name,'w+')
16 #写入文件内容
17 fp.writelines("12345\n")
18 fp.writelines("67890\n")
19 #关闭文件
20 fp.close()
21
22 #调用函数
23 create_file()
如上图所示,执行脚本就会生成一份原始文件,不过在两行内容的末尾,换行符均显示为CRLF,接下来就是转换的工作了。
Method C:对原文件进行格式转换
如果是对现有的文件进行处理,可以使用Notepad++再编写一个转换的脚本。参考网上的方法,使用rU方式读取文件内容,使用wb方式写入文件内容,如下图所示:
1 #coding:utf-8
2 import os
3
4 #文件路径准备
5 route=r"C:\Study\Chestnuts\01data"
6
7 #遍历路径下目录,文件夹,文件
8 for root,dirs,files in os.walk(route):
9 #遍历文件
10 for name in files:
11 #归纳文件名特征
12 if name[-3:]=='dat':
13 #拼接文件名(目录+文件名称)
14 catalog=os.path.join(root,name)
15 #把所有行分割符替换为换行符\n返回.
16 fp=open(catalog,"rU+")
17 #读取文件并保存
18 strings=fp.read()
19 fp.close()
20 #使用二进制写文件
21 fp1=open(catalog,"wb")
22 fp1.seek(0)
23 fp1.write(strings)
24 fp1.flush()
25 fp1.close()
执行这个脚本,就能对现有文件格式进行转换,得到换行符是LF的文件了。
结果是对了,但执行两个脚本来生成一份最终文件,难免让我觉得还不够简单。我分析了以上文件转换的代码,发现关键步骤是使用二进制(wb)方式写入文件。
Method D:原文件使用二进制方式写入
既然这样,不如在一开始就使用二进制写文件,一步到位!并且只需把源代码中写入方式(w)变成二进制写入(wb)方式即可。你看,仅仅添加了一个字母,就省去了十几行代码,还达到了预期目标,可谓一举多得!
#coding:utf-8(设定文件编码格式)
import os
import time
#切换到创建文件目录
os.chdir(r"C:\Study\Chestnuts\01data")
#新建创建文件函数
def create_file():
#构造文件名:以“年月日”为文件名的.dat文件
t=time.localtime()
file_name=time.strftime("%Y-%m-%d",t)+".dat"
#创建并打开文件
fp=open(file_name,'wb+')
#写入文件内容
fp.writelines("12345\n")
fp.writelines("67890\n")
#关闭文件
fp.close()
#调用函数
create_file()
⑼ 为什么 Python,Ruby 等语言弃用了自增运算符
在 Python 中,整数是一种不可变类型。在创建对象之后,其值就不能再被改变。
在 Java 或 C 等语言中, ++ 做的事情是让这个变量的值 +1,比如 a = 1; a++,意思是将 a 原本的内存区域表示的值替换为原本的值 +1。而在 Python 中,一旦一个整数对象创建,其值就不能再被改变。所以,就无法实现 自增、自减 操作了。
---------------
更新一下吧,关于 i += 1 和 i = i + 1 究竟有什么不一样。在大多数情况下,你可以认为这两种写法是等价的。但是在实现上,还是有些许差异的,下面以整形变量 a 举例,两种写法生成的字节码如下:
i += 1:
6 LOAD_FAST 0 (a)
9 LOAD_CONST 1 (1)
12 INPLACE_ADD
13 STORE_FAST 0 (a)
i = i + 1
6 LOAD_FAST 0 (a)
9 LOAD_CONST 1 (1)
12 BINARY_ADD
13 STORE_FAST 0 (a)
可以看到,在底层调用上还是不同的。反应到 Python 语言层面的实现上,__add__ 对应着 + 号运算,而 __iadd__ 对应着 += 运算。