目录
5. itertools.chain.from_iterable
1. os函数总结
os.path.exists(self.DATA_OUTPUT_DIR):路径是否存在,返回True、False
os.path.join(os.path.dirname(__file__), "../../"):拼接路径
os.path.abspath():获取当前绝对路径
os.makedirs():makedirs
os.path.dirname的用法
语法:os.path.dirname(path)
功能:去掉文件名,返回目录
print(os.path.dirname('W:\Python_File\juan之购物车.py'))
#结果
#W:\Python_File
os.path.dirname(__file__):返回脚本的路径
(__file__):__file__表示了当前文件的绝对路径
os.path.dirname(__file__)和os.path.dirname(“E:/Read_File/read_yaml.py”)是一个意思,得出os.path.dirname(__file__)就是得到当前文件的绝对路径
os.path.dirname(__file__)
Out[3]: 'G:/python/Machine_learning/NLP/Entity-Relation-Extraction-master/bin/predicate_classifiction'
但是需要注意一下几点:
- 必须是实际存在的.py文件,如果在命令行执行,则会引发异常NameError: name '__file__' is not defined;
- 在运行的时候如果输入完整的执行路径,则返回.py文件的全路径如:Python c:/test/test.py 则返回路径 c:/test ,如果是python test.py 则返回空;
- 结合os.path.abspath用,效果会好,如果大家看过一些python架构的代码的话,会发现经常有这样的组合:os.path.dirname(os.path.abspath(__file__)),os.path.abspath(__file__)返回的是.py文件的绝对路径。
2. json
- dump 和 dumps 都实现了序列化
- load 和 loads 都实现反序列化
变量从内存中变成可存储或传输的过程称之为序列化,序列化是将对象状态转化为可保存或可传输格式的过程。
变量内容从序列化的对象重新读到内存里称之为反序列化,反序列化是流转换为对象。
3. 字典dict函数
Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
dict.setdefault(key, default=None)
4. codecs.open 和一般的open 区别
https://www.cnblogs.com/buptldf/p/4805879.html
open:内置函数
总结一下:文件读尽量用codecs.open方法,一般不会出现编码的问题。
python读写文件估计大家都用open内置函数,或者file这个工厂函数,这两个的效果基本一样。
打开文件的方式一般为:f=open(file_name,access_mode = 'r',buffering = -1)。file_name就是文件的路径加文件名字,不加路径则文件会存放在python程序的路径下,
access_mode就是操作文件的模式,主要有r,w,rb,wb等,细节网上一大堆,buffering = -1是用于指示访问文件所采用的缓存方式。0表示不缓存;1表示只缓存一行,n代表缓存n行。如果不提供或为负数,则代表使用系统默认的缓存机制。
打开以后就是写和读的操作。但是用open方法打开会有一些问题。open打开文件只能写入str类型,不管字符串是什么编码方式。
5. itertools.chain.from_iterable
itertools模块包含创建有效迭代器的函数,可以用各种方式对数据进行循环操作,此模块中的所有函数返回的迭代器都可以与for循环语句以及其他包含迭代器(如生成器和生成器表达式)的函数联合使用。
chain:组合工具
我们可以通过组合原有循环器,来获得新的循环器。
chain链接可遍历对象(iter1, iter2, ..., iterN)
给出一组迭代器(iter1, iter2, ..., iterN),此函数创建一个新迭代器来将所有的迭代器链接起来,返回的迭代器从iter1开始生成项,知道iter1被用完,然后从iter2生成项,这一过程会持续到iterN中所有的项都被用完。
from itertools import chain
test = chain('AB', 'CDE', 'F')
for el in test:
print el
结果:
A
B
C
D
E
F
chain.from_iterable(iterables)
一个备用链构造函数,其中的iterables是一个迭代变量,生成迭代序列,此操作的结果与以下生成器代码片段生成的结果相同:
>>> def f(iterables):
for x in iterables:
for y in x:
yield y
>>> test = f('ABCDEF')
>>> test.next()
'A'
>>> from itertools import chain
>>> test = chain.from_iterable('ABCDEF')
>>> test.next()
'A'
Flattening lists扁平列表的不同实现方式:
list(itertools.chain.from_iterable(a))
>>> a = [[1, 2], [3, 4], [5, 6]]
>>> list(itertools.chain.from_iterable(a))
[1, 2, 3, 4, 5, 6]
6. Python ljust() 方法
返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
语法
str.ljust(width[, fillchar])
参数
- width -- 指定字符串长度。
- fillchar -- 填充字符,默认为空格。
实例
以下实例展示了ljust()的使用方法:
#!/usr/bin/python
str = "this is string example....wow!!!";
print str.ljust(50, '0');
以上实例输出结果如下:
this is string example....wow!!!000000000000000000
7. 全角和半角
首先介绍一下什么是全角和半角:全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E),半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E),空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)。除空格外,全角/半角按unicode编码排序在顺序上是对应的(半角 + 65248 = 全角)。那代码就好写了。
1 def DBC2SBC(ustring):
2 n = []
3 # python3现在已经将unichr和chr合并,所以网上的代码已经不合适
4 for char in ustring:
5 num = ord(char)
6 if num == 0x3000:
7 num = 32
8 elif 0xFF01 <= num <= 0xFF5E:
9 num -= 0xfee0
10 num = chr(num)
11 n.append(num)
12 return ''.join(n)
13
14 if __name__ == '__main__':
15 a = '《中文》(213)'
16 print(a)
17 print(DBC2SBC(a))
8. ord()、chr()、unichr()
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
>>> ord('a')
97
>>> ord('b')
98
>>> ord('c')
99
chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个当前整数对应的 ASCII字符。
>>> print chr(0x30), chr(0x31), chr(0x61) # 十六进制
0 1 a
>>> print chr(48), chr(49), chr(97) # 十进制
0 1 a
unichr() 函数 和 chr()函数功能基本一样, 只不过是返回 unicode 的字符。
>>> unichr(97)
u'a'
>>> unichr(98)
u'b'
>>> unichr(99)
u'c'
9.np.full、np.empty
(1)np.full
构造一个数组,用指定值填充其元素。
full(shape, fill_value, dtype=None, order='C')
- shape:int 或者 int元组
- fill_value:填充到数组中的值
import numpy as np
# 构造一个2x3的数组,其中元素全部都为 7
ndarray = np.full((2, 3), 7)
print(ndarray)
"""
[[7 7 7]
[7 7 7]]
(2)np.empty
构造一个长度为 shape 的未初始化数组,这个数组的元素可能是内存位置上存在的任何数值。
empty(shape, dtype=float, order='C')
- shape : int 或者 int元组
- dtype : 数组中元素的格式
- order : 'C' 或 'F', 分别代表,行优先row-major (C-style)和列优先column-major (Fortran-style),表示在计算机内存中的存储元素的顺序。
10. collections.namedtuple
namedtuple是继承自tuple的子类,创建一个和tuple类似的对象,而且对象拥有可访问的属性。
namedtuple能够用来创建类似于元祖的数据类型,除了能够用索引来访问数据,能够迭代,更能够方便的通过属性名来访问数据。在python中,传统的tuple类似于数组,只能通过下标来访问各个元素,我们还需要注释每个下标代表什么数据。通过使用namedtuple,每个元素有了自己的名字,类似于C语言中的struct,这样数据的意义就可以一目了然了。当然,声明namedtuple是非常简单方便的。
from collections import namedtuple
# 1.定义一个namedtuple类型User,并包含name,sex和age属性。
User = namedtuple('User', 'name sex age')
User = namedtuple('User', ['name', 'sex', 'age'])
# 2.创建一个User对象
user1 = User(name='小红', sex='女', age='22')
user1 = User('小红','女', '22')
# 也可以通过一个list、dict来创建一个User对象,使用"_make"方法
user2 = User._make(['小明', '男', '21'])
user3 = User._make({'name':'小王', 'sex':'男', 'age':'19'})
name, sex, age=user1
# 3.获取用户的属性
print(user1.name) # 小红,女,22
print(user1.sex)
print(user1.age)
# 4.修改对象属性,注意要使用"_replace"方法
user11 = user1._replace(age=25)
print(user) # User(name='小红', sex='女', age='25')
# 5.将User对象转换成字典,注意要使用"_asdict"
user2._asdict()
# OrderedDict([('name', '小明'), ('sex', '男'), ('age', '21')])
print(user2) # User(name='小明', sex='男', age='21')