原理
一个可迭代对象的类型是Iterable.
使用isinstance(objectName, Iterable)可判断。如果isinstance(objectName)返回True,表明对象是可迭代的
否则是不可迭代的。
原理
使用isinstance(objectName, Iterable)可判断。如果isinstance(objectName, Iterator)返回True,表明对象是Iterator对象; 否则不是。
使用iter(IteratorObjectName); 好处是Iterator对象可以使用next()返回下一个值。
例子
>>> from collections import Iterator, Iterable
>>> ll = [1,2,3]
>>> isinstance(ll, Iterable) ##判断ll是否是可迭代的
>>> gene = (x*x for x in [1,2,3])
>>> isinstance(gene, Iterable) ##判断gene是否是Iterable对象
>>> llIter = iter(ll) ##把ll非Iterator对象变成Iterable对象
>>> isinstance(llIter, Iterator) ##返回值为true,表明llIter(原为Iterable)已经变成了Iterator对象.
功能: 把可打印字符中字母,数字抽取出;其他可打印字符转换成空格。
版本一:使用基本python语法
def clearStr(char):
newChar = ""
import string
if char in string.printable: ##判断char是否是可打印字符
if char.isalnum() or char.isspace():
newChar = char
else:
newChar = " "
return newChar
def change():
ll = "Linksys EtherFast 8-Port 10/100 Switch (New/Workgroup)"
newll = map(clearStr, ll)
print "".join(newll)
版本二:使用Keras
推荐,理由能用开源的工具,就用。
使用Keras的text_to_word_sequence 函数.
import keras
from keras.preprocessing import text
def cleanStr():
s = "abc-df 1323/dfd"
newS = keras.preprocessing
newText = keras.preprocessing.text.text_to_word_sequence(s,
filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n', lower=True, split=" ")
print newText, type(newText)
原则
* 进行文件操作,不使用字符串拼接的方式。理由:你的代码可以跨系统执行,不需要有额外的修改。
方法,调用os.path的join函数
import os
dirV1 = '/home/xuyl/PycharmProjects/StudyPython' ##目录名caseI
dirV2 = '/home/xuyl/PycharmProjects/StudyPython/' ##目录名caseII
file = 'abtbuy.inconsistentPair.txt' ##文件名
pathV1 = os.path.join(dirV1, file) ##将文件名和目录名连接在一起
pathV2 = os.path.join(dirV2, file)
方法,调用os.path的split函数
import os
absPath = 'home/xuyl/123.txt'
rootDir, fn = os.path.split(absPath) ##caseI: 把路径分成两部分,第一部分是目录;第二部分是文件名
path = 'home/xuyl'
other, lastDirName = os.path.split(absPath) ##caseII:把路径分成两部分,第一部分是部分目录(去掉最后一个目录的);第二部分是最后一级的目录名
方法 调用os.path的splitext函数。
例子
import os
absPath = 'home/xuyl/123.txt'
other, extendName = os.path.splitext(absPath) ##返回值的第二部分是.txt
函数 os.remove()
import os
os.remove(/home/test.txt)
函数 调用file.write()
例子
with open("/home/log.txt", 'a') as f: ##追加文件
f.write("Hello world!\n")
思路 一次读入内存
方式一:read()+close() 不推荐太复杂了-必须有f.close()函数。
import os
dir = '/home/xuyl/PycharmProjects/'
file = 'abtbuyP.txt'
path = os.path.join(dir, file)
try:
f = open(path, 'r')
f.read() ##一次读入内存
finally:
if f:
f.close()
方式二:read()+with子句
import os
dir = '/home/xuyl/PycharmProjects/'
file = 'abtbuyP.txt'
path = os.path.join(dir, file)
with open(path, 'r') as f: ### with clause can close file after operate.
print(f.read())
方式三:read()+codecs.open()
例子
import codecs
with codecs.open('/home/xuyl/test.txt', 'r', encoding='utf-8') as f:
f.read()
思路 一行一行读
调用的函数 f.readlines()
例子 如read()函数类似,有三种调用方法
import os
dir = '/home/xuyl/PycharmProjects/'
file = 'abtbuyP.txt'
path = os.path.join(dir, file)
try:
f = open(path, 'r')
for line in f.readlines(): ### read file line by line.
print(line.strip())
finally:
if f:
f.close()
使用pickle和cPickle的函数是相同的,但据说cPickle比较快(理由-cPickle底层使用的是c代码).参考的是文献[3]的pickle代码。
import cPickle
info_dict = {'1':1, '2': 1, '3': 3}
f = open('info.pkl', 'wb')
cPickle.dump(info_dict, f) ##将python对象info_dict存储到本地
f.close()
f = open('info.pkl', 'r+')
info2_dict = cPickle.load(f)##将文件info.pkl文件中python对象,抽取到内存
print info2_dict
PS:不清楚是否必须使用后缀名.pkl.
import keras
from keras.preprocessing import text
def extractDictionary():
texts=[]
texts.append("Kenwood KDC-C669 Car CD Changer - KDCC669")
texts.append("Cordless Solo S2 Radar/Laser Detector - 010ES20A")
tokenizer = keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(texts) ##feed texts to Tokenizer
word_index = tokenizer.word_index ## word_index 包含文本texts中,所有单词的词典, 且词典的键是word, 值是索引下标。
print "word_index:", word_index
texts_seq = tokenizer.texts_to_sequences(texts) ## 将文本转换成序列. 该序列是文本中单词在word_index的键值。
print "texts_seq", texts_seq ##PS: 不明白为什么会是15个单词,明明词典里面只有14个
texts_matrix = tokenizer.texts_to_matrix(texts, mode="tfidf")##将文本转换成一个向量,该向量是文本中
texts_matrix = tokenizer.texts_to_matrix(texts, mode="binary")
print texts_matrix, "shape of texts_matrix", texts_matrix.shape
"""
任务,计算list中元素的和,均值和最大值等。
核心思想, 把list转换成numpy的ndarray多维数组,然后用矩阵运算来计算。
好处:第一,必然比你用高级语言写的代码快(底层用c实现);第二,节省时间-直接调接口.不需要你花费时间检查逻辑。
"""
def mathOperation():
ll = [1,2,3]
import numpy as np
lla = np.asarray(ll)
print "sum", lla.sum()
print "max", lla.max()
print "average", lla.mean()
注意事项:
* 把属性名,设置为__xxx;
* 使用@property修饰器,把属性变成可读的属性;
* 使用@xx.setter修饰器,把属性变成可写的属性(属性值可修改)。
* 类属性与实例属性的区别是,实例属性位于init(self)下面,并且需要有前缀”self”.
example
class CatII(object):
__type = "Br" ## 类属性(class attribute)
def __init__(self):
self.__name = "" ## 实例属性(instance attribute) 方式一
pass
### set instance attribute and methods.
@property
def name(self):## 获得实例属性
return self.__name ## 实例属性(instance attribute) 方式一
@name.setter
def name(self, value):##将实例属性设置为value
self.__name = value
### class attribute and methods
@property
def type(cls): ##获得类属性的
'class method get the class attribute value'
return cls.__type
@type.setter
def type(cls, value): ##设置类的属性值
cls.__type = value
PS: 代码可以从git 上InstanceVSClass下载。
"""
output time difference in seconds.
"""
def getTimeDiff():
start = datetime.datetime.now()
time.sleep(5)
end = datetime.datetime.now()
diff = end - start
print("diff:", diff)
print("diff.seconds", (end - start).seconds) ##输出时间差,以秒为单位
[1] 廖雪峰的官网 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
[2] Keras中文文档 https://keras-cn.readthedocs.io/en/latest/preprocessing/text/
[3] pickle 存储到本地 https://blog.linuxeye.cn/369.html