• 关于

    python中末尾

    的搜索结果

回答

1、说明:windows下设置python环境变量,就是把python的安装目录添加到系统path中。2、步骤:1)确定python安装目录,根据版本不同安装目录也不同,可以在开始菜单中的快捷方式中查看。在python快捷方式上点右键,属性菜单2)在目录中可以看到安装位置,C:Program FilesPython35\3)在桌面计算机点右键属性,也可以在控制面板中选系统4)点高级系统设置:5)高级标签,点环境变量按钮:6)在系统变量中找到Path然后点编辑:7)在变量值末尾添加;C:Program FilesPython35,就是你python安装的目录,注意如果原来末尾没有分号要添加一个分号。然后点确定,再把之前的对话框也确定。8)这样环境变量就设置完成了,win+r打开运行对话框输入cmd打开命令行,在命令行中输入python,出现如下就说明设置成功了。

ylrf1212 2019-12-02 01:06:30 0 浏览量 回答数 0

回答

1、说明:windows下设置python环境变量,就是把python的安装目录添加到系统path中。2、步骤:1)确定python安装目录,根据版本不同安装目录也不同,可以在开始菜单中的快捷方式中查看。在python快捷方式上点右键,属性菜单2)在目录中可以看到安装位置,C:Program FilesPython35,如下图:3)在桌面计算机点右键属性,也可以在控制面板中选系统4)点高级系统设置:5)高级标签,点环境变量按钮:6)在系统变量中找到Path然后点编辑:7)在变量值末尾添加;C:Program FilesPython35,就是你python安装的目录,注意如果原来末尾没有分号要添加一个分号。然后点确定,再把之前的对话框也确定。8)这样环境变量就设置完成了,win+r打开运行对话框输入cmd打开命令行,在命令行中输入python,出现如下就说明设置成功了。3、注意事项:如果未出现python结果,则需要检查路径是否设置正确,并重新启动一下计算机即可。

xuning715 2019-12-02 01:10:15 0 浏览量 回答数 0

回答

熟记几个基本的命令行和使用方法能够较快的在Linux命令行环境中将python用起来。 打开命令行窗口 打开命令行窗口的快捷键如下: Ctrl + Alt + t 关闭名命令行窗口 关闭命令行窗口的快捷键如下: Ctrl + d 进入python环境 在命令行中直接输入python即进入了python的编辑环境。进入环境后最明显的提示是:光标由~$变成>>>。 退出python环境 使用ctrl +d的方式退出python环境。回到命令行环境。 在python环境中输入多行函数 在python环境中,回车是输入结束并执行语句。在输入多行函数的情况下,输入一行后回车则直接运行了某句代码而不是整个函数块。因此,需要能够换行但不结束输入的方法。 在语句的末尾输入英文的;即可实现换行。 例如: def weight_variable(shape): initial = tf.truncated_normal(shape, stddev=0.1);\ return tf.Variable(initial);\注意:输入函数块时注意缩进,否者会报出IndentationError: unexpected indent python错误。 输入中文字符导致non-ascii character xe5 in file解决方法 原因:程序中的编码错误,python默认支持acii模式,但不支持utf8,因此,程序中的中文注释会引发Error。 解决方法:源代码文件第一行添加#coding:utf-8即可避免。

世事皆空 2019-12-02 01:07:01 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

Python2 有 int 和 long 类型。int 类型最大值不能超过 sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比 int 类型表示的数字范围更大。在 Python3 里,只有一种整数类型 int,大多数情况下,和 Python2中的长整型类似。

珍宝珠 2019-12-02 03:12:53 0 浏览量 回答数 0

回答

包含end=''作为print()BIF的一个参数,会使该函数关闭“在输出中自动包含换行”的默认行为。其原理是:为end传递一个空字符串,这样print函数不会在字符串末尾添加一个换行符,而是添加一个空字符串。这个只有Python3有用,Python2不支持。

世事皆空 2019-12-02 01:07:21 0 浏览量 回答数 0

问题

当进程退出时,python多处理是否调用静态变量的c++析构函数?

kun坤 2019-12-27 10:16:12 4 浏览量 回答数 1

问题

python测试框架

祖安文状元 2020-02-22 18:17:36 0 浏览量 回答数 1

回答

在开始和结束算法方面,我们决定遵循Python。 0 指定第一个元素(一如既往),并 ^0 指定“ length'th”元素,即紧接末端的元素。这样,您将获得一个简单的关系,其中元素从开始位置的位置加上其从结束位置的位置等于长度。 如果您自己进行数学运算,则 x in ^x是从长度中减去的值。 为什么不使用减号(-)而不是新的hat(^)运算符?这主要与范围有关。再次与Python和大多数行业保持一致,我们希望我们的范围在开始时就包含所有内容,而在结尾处包含所有内容。您传递的要说范围应该一直到终点的索引是什么?在C#中,答案很简单:x..^0从头到尾 x 。在Python中,没有可以提供的显式索引:-0不起作用,因为它等于0第一个元素!因此,在Python中,您必须完全不使用end索引来表示到达末尾的范围:x..。如果计算了范围的末尾,那么您需要记住要有特殊的逻辑,以防万一0。正如x..-y,在那里y被计算出来了0。这是常见的麻烦和错误源。 最后,请注意,索引和范围是.NET / C#中的第一类类型。它们的行为不依赖于它们的应用,甚至不用于索引器。您可以完全定义自己的使用index的索引器,以及定义使用索引的另一个索引器Range–我们将在eg中添加此类索引器 Span。但是,例如,您也可以使用采用范围的方法 问题来源于stack overflow

保持可爱mmm 2020-02-06 23:27:37 0 浏览量 回答数 0

问题

如何在python熊猫中找到最后一个单元格的索引?

kun坤 2019-12-27 10:09:21 0 浏览量 回答数 1

回答

Python 变量类型变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。 变量赋值Python 中的变量赋值不需要类型声明。每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- counter = 100 # 赋值整型变量miles = 1000.0 # 浮点型name = "John" # 字符串 print counterprint milesprint name 运行实例 »以上实例中,100,1000.0和"John"分别赋值给counter,miles,name变量。执行以上程序会输出如下结果:1001000.0John多个变量赋值Python允许你同时为多个变量赋值。例如:a = b = c = 1以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。您也可以为多个对象指定多个变量。例如:a, b, c = 1, 2, "john"以上实例,两个整型对象1和2的分配给变量 a 和 b,字符串对象 "john" 分配给变量 c。 标准数据类型在内存中存储的数据可以有多种类型。例如,一个人的年龄可以用数字来存储,他的名字可以用字符来存储。Python 定义了一些标准类型,用于存储各种类型的数据。Python有五个标准的数据类型:Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典) Python数字数字数据类型用于存储数值。他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象。当你指定一个值时,Number对象就会被创建:var1 = 1var2 = 10您也可以使用del语句删除一些对象的引用。del语句的语法是:del var1[,var2[,var3[....,varN]]]]您可以通过使用del语句删除单个或多个对象的引用。例如:del vardel var_a, var_bPython支持四种不同的数字类型:int(有符号整型)long(长整型[也可以代表八进制和十六进制])float(浮点型)complex(复数)实例一些数值类型的实例:int long float complex10 51924361L 0.0 3.14j100 -0x19323L 15.20 45.j-786 0122L -21.9 9.322e-36j080 0xDEFABCECBDAECBFBAEl 32.3e+18 .876j-0490 535633629843L -90. -.6545+0J-0x260 -052318172735L -32.54e100 3e+26J0x69 -4721885298529L 70.2E-12 4.53e-7j长整型也可以使用小写 l,但是还是建议您使用大写 L,避免与数字 1 混淆。Python使用 L 来显示长整型。Python 还支持复数,复数由实数部分和虚数部分构成,可以用 a + bj,或者 complex(a,b) 表示, 复数的实部 a 和虚部 b 都是浮点型。 Python字符串字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 :s="a1a2···an"(n>=0)它是编程语言中表示文本的数据类型。python的字串列表有2种取值顺序:从左到右索引默认0开始的,最大范围是字符串长度少1从右到左索引默认-1开始的,最大范围是字符串开头如果你要实现从字符串中获取一段子字符串的话,可以使用变量 [头下标:尾下标],就可以截取相应的字符串,其中下标是从 0 开始算起,可以是正数或负数,下标可以为空表示取到头或尾。比如:s = 'ilovepython's[1:5]的结果是love。当使用以冒号分隔的字符串,python返回一个新的对象,结果包含了以这对偏移标识的连续的内容,左边的开始是包含了下边界。上面的结果包含了s[1]的值l,而取到的最大范围不包括上边界,就是s[5]的值p。加号(+)是字符串连接运算符,星号(*)是重复操作。如下实例:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- str = 'Hello World!' print str # 输出完整字符串print str[0] # 输出字符串中的第一个字符print str[2:5] # 输出字符串中第三个至第五个之间的字符串print str[2:] # 输出从第三个字符开始的字符串print str * 2 # 输出字符串两次print str + "TEST" # 输出连接的字符串以上实例输出结果:Hello World!Hllollo World!Hello World!Hello World!Hello World!TESTPython列表List(列表) 是 Python 中使用最频繁的数据类型。列表可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(即嵌套)。列表用 [ ] 标识,是 python 最通用的复合数据类型。列表中值的切割也可以用到变量 [头下标:尾下标] ,就可以截取相应的列表,从左到右索引默认 0 开始,从右到左索引默认 -1 开始,下标可以为空表示取到头或尾。加号 + 是列表连接运算符,星号 * 是重复操作。如下实例:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]tinylist = [123, 'john'] print list # 输出完整列表print list[0] # 输出列表的第一个元素print list[1:3] # 输出第二个至第三个元素 print list[2:] # 输出从第三个开始至列表末尾的所有元素print tinylist * 2 # 输出列表两次print list + tinylist # 打印组合的列表以上实例输出结果:['runoob', 786, 2.23, 'john', 70.2]runoob[786, 2.23][2.23, 'john', 70.2][123, 'john', 123, 'john']['runoob', 786, 2.23, 'john', 70.2, 123, 'john']Python元组元组是另一个数据类型,类似于List(列表)。元组用"()"标识。内部元素用逗号隔开。但是元组不能二次赋值,相当于只读列表。实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )tinytuple = (123, 'john') print tuple # 输出完整元组print tuple[0] # 输出元组的第一个元素print tuple[1:3] # 输出第二个至第三个的元素 print tuple[2:] # 输出从第三个开始至列表末尾的所有元素print tinytuple * 2 # 输出元组两次print tuple + tinytuple # 打印组合的元组以上实例输出结果:('runoob', 786, 2.23, 'john', 70.2)runoob(786, 2.23)(2.23, 'john', 70.2)(123, 'john', 123, 'john')('runoob', 786, 2.23, 'john', 70.2, 123, 'john')以下是元组无效的,因为元组是不允许更新的。而列表是允许更新的:实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- tuple = ( 'runoob', 786 , 2.23, 'john', 70.2 )list = [ 'runoob', 786 , 2.23, 'john', 70.2 ]tuple[2] = 1000 # 元组中是非法应用list[2] = 1000 # 列表中是合法应用 Python 字典字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象集合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。字典用"{ }"标识。字典由索引(key)和它对应的值value组成。实例(Python 2.0+) !/usr/bin/python -- coding: UTF-8 -- dict = {}dict['one'] = "This is one"dict[2] = "This is two" tinydict = {'name': 'john','code':6734, 'dept': 'sales'} print dict['one'] # 输出键为'one' 的值print dict[2] # 输出键为 2 的值print tinydict # 输出完整的字典print tinydict.keys() # 输出所有键print tinydict.values() # 输出所有值输出结果为:This is oneThis is two{'dept': 'sales', 'code': 6734, 'name': 'john'}['dept', 'code', 'name']['sales', 6734, 'john']Python数据类型转换有时候,我们需要对数据内置的类型进行转换,数据类型的转换,你只需要将数据类型作为函数名即可。以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。函数 描述int(x [,base])将x转换为一个整数long(x [,base] )将x转换为一个长整数float(x)将x转换到一个浮点数complex(real [,imag])创建一个复数str(x)将对象 x 转换为字符串repr(x)将对象 x 转换为表达式字符串eval(str)用来计算在字符串中的有效Python表达式,并返回一个对象tuple(s)将序列 s 转换为一个元组list(s)将序列 s 转换为一个列表set(s)转换为可变集合dict(d)创建一个字典。d 必须是一个序列 (key,value)元组。frozenset(s)转换为不可变集合chr(x)将一个整数转换为一个字符unichr(x)将一个整数转换为Unicode字符ord(x)将一个字符转换为它的整数值hex(x)将一个整数转换为一个十六进制字符串oct(x)将一个整数转换为一个八进制字符串

xuning715 2019-12-02 01:10:21 0 浏览量 回答数 0

问题

如何从Python中通过“ stdin”输入的字符串中删除子字符串

is大龙 2020-03-24 12:25:22 0 浏览量 回答数 1

回答

目测文件编码问题。######我觉得这个朋友回复正确的。我目测,是你第二行里的:,用是中文方式输入的,你把:换成英文方式的:试试######我改了,UTF-8,加BOM和不加都是这个结果######sublime2不支持输入参数,要么装插件,要么换vim吧######应该用什么插件呢?以后用sublime测试python不是很麻烦?######请不要有中文目录######我的Python还有源文件都没有使用中文路径啊######这个非常像刚开始学习C++的时候遇到的文件结尾符号的问题,  当时好像还研究过这个问题, 可以尝试在写完所有代码后,再回车换行一行,再保存.  就是说最后会有一个空行在末尾.###### 2.7.5是print("hello")? 难道我out了。。我记得这是3的写法吧。 2都是pring "hello" 是不是这样呢 ######print() === 》2.6,2.7 3.X######不支持输入!######呃,搜了一下,发现有人研究过这个问题了,不过最后的结论是sublime text2不适合开发python= =我也刚装了准备试下呢,被打击了,文章你自己看看吧 http://www.crifan.com/python_sublime_text_2_eoferror_eof_when_reading_a_line/###### 是这样的。。要么在terminal下运行,要么装个repl。。python还算好了,ruby我还没找到方便的呢。。这点还是VIM方便 ###### 早就,深入的分析并解决了: 【已解决】Sublime中运行带input或raw_input的Python代码出错:EOFError: EOF when reading a line 但是结论还是: sublime用来开发python 我个人是很不推荐的。 当然用来看代码还是蛮爽的。 详见: 总结:到底使用哪种环境去开发Python

kun坤 2020-06-09 22:35:25 0 浏览量 回答数 0

回答

一、文件的打开和创建 ? 12345 f = open('/tmp/test.txt')f.read()'hello python!nhello world!n'f 二、文件的读取步骤:打开 -- 读取 -- 关闭 ? 1234 f = open('/tmp/test.txt')f.read() 'hello python!nhello world!n' f.close() 读取数据是后期数据处理的必要步骤。.txt是广泛使用的数据文件格式。一些.csv, .xlsx等文件可以转换为.txt 文件进行读取。我常使用的是Python自带的I/O接口,将数据读取进来存放在list中,然后再用numpy科学计算包将list的数据转换为array格式,从而可以像MATLAB一样进行科学计算。 下面是一段常用的读取txt文件代码,可以用在大多数的txt文件读取中 ? 12345678910111213141516 filename = 'array_reflection_2D_TM_vertical_normE_center.txt' # txt文件和当前脚本在同一目录下,所以不用写具体路径pos = []Efield = []with open(filename, 'r') as file_to_read: while True: lines = file_to_read.readline() # 整行读取数据 if not lines: break pass p_tmp, E_tmp = [float(i) for i in lines.split()] # 将整行数据分割处理,如果分割符是空格,括号里就不用传入参数,如果是逗号, 则传入‘,'字符。 pos.append(p_tmp) # 添加新读取的数据 Efield.append(E_tmp) pass pos = np.array(pos) # 将数据从list类型转换为array类型。 Efield = np.array(Efield) pass 例如下面是将要读入的txt文件 2016626171647895.png (429×301) 经过读取后,在Enthought Canopy的variable window查看读入的数据, 左侧为pos,右侧为Efield。 2016626171713978.png (148×277)2016626171743777.png (147×280) 三、文件写入(慎重,小心别清空原本的文件)步骤:打开 -- 写入 -- (保存)关闭 直接的写入数据是不行的,因为默认打开的是'r' 只读模式 ? 123456 f.write('hello boy')Traceback (most recent call last): File "", line 1, in IOError: File not open for writing f 应该先指定可写的模式 ? 12 f1 = open('/tmp/test.txt','w')f1.write('hello boy!') 但此时数据只写到了缓存中,并未保存到文件,而且从下面的输出可以看到,原先里面的配置被清空了 ? 12 [root@node1 ~]# cat /tmp/test.txt[root@node1 ~]# 关闭这个文件即可将缓存中的数据写入到文件中 ? 123 f1.close() [root@node1 ~]# cat /tmp/test.txt[root@node1 ~]# hello boy! 注意:这一步需要相当慎重,因为如果编辑的文件存在的话,这一步操作会先清空这个文件再重新写入。那么如果不要清空文件再写入该如何做呢? 使用r+ 模式不会先清空,但是会替换掉原先的文件,如下面的例子:hello boy! 被替换成hello aay! ? 12345 f2 = open('/tmp/test.txt','r+')f2.write('nhello aa!')f2.close() [root@node1 python]# cat /tmp/test.txthello aay! 如何实现不替换? ? 12345678 f2 = open('/tmp/test.txt','r+')f2.read() 'hello girl!' f2.write('nhello boy!')f2.close() [root@node1 python]# cat /tmp/test.txthello girl!hello boy! 可以看到,如果在写之前先读取一下文件,再进行写入,则写入的数据会添加到文件末尾而不会替换掉原先的文件。这是因为指针引起的,r+ 模式的指针默认是在文件的开头,如果直接写入,则会覆盖源文件,通过read() 读取文件后,指针会移到文件的末尾,再写入数据就不会有问题了。这里也可以使用a 模式 ? 12345678 f = open('/tmp/test.txt','a')f.write('nhello man!')f.close() [root@node1 python]# cat /tmp/test.txthello girl!hello boy!hello man! 关于其他模式的介绍,见下表: 2016626170852899.png (713×317) 文件对象的方法:f.readline() 逐行读取数据 方法一: ? 123456789 f = open('/tmp/test.txt')f.readline() 'hello girl!n' f.readline() 'hello boy!n' f.readline() 'hello man!' f.readline() '' 方法二: ? 123456789101112 for i in open('/tmp/test.txt'): ... print i...hello girl!hello boy!hello man!f.readlines() 将文件内容以列表的形式存放 f = open('/tmp/test.txt')f.readlines() ['hello girl!n', 'hello boy!n', 'hello man!'] f.close() f.next() 逐行读取数据,和f.readline() 相似,唯一不同的是,f.readline() 读取到最后如果没有数据会返回空,而f.next() 没读取到数据则会报错 ? 12345678910111213141516 f = open('/tmp/test.txt')f.readlines() ['hello girl!n', 'hello boy!n', 'hello man!'] f.close() f = open('/tmp/test.txt')f.next() 'hello girl!n' f.next() 'hello boy!n' f.next() 'hello man!' f.next() Traceback (most recent call last):File "", line 1, in StopIteration f.writelines() 多行写入 ? 1234567891011 l = ['nhello dear!','nhello son!','nhello baby!n']f = open('/tmp/test.txt','a')f.writelines(l)f.close() [root@node1 python]# cat /tmp/test.txthello girl!hello boy!hello man!hello dear!hello son!hello baby! f.seek(偏移量,选项) ? 12345678910111213141516 f = open('/tmp/test.txt','r+')f.readline() 'hello girl!n' f.readline() 'hello boy!n' f.readline() 'hello man!n' f.readline() ' ' f.close()f = open('/tmp/test.txt','r+')f.read() 'hello girl!nhello boy!nhello man!n' f.readline() '' f.close() 这个例子可以充分的解释前面使用r+这个模式的时候,为什么需要执行f.read()之后才能正常插入f.seek(偏移量,选项)(1)选项=0,表示将文件指针指向从文件头部到“偏移量”字节处 (2)选项=1,表示将文件指针指向从文件的当前位置,向后移动“偏移量”字节 (3)选项=2,表示将文件指针指向从文件的尾部,向前移动“偏移量”字节 偏移量:正数表示向右偏移,负数表示向左偏移 ? 12345678910111213 f = open('/tmp/test.txt','r+')f.seek(0,2)f.readline() '' f.seek(0,0)f.readline() 'hello girl!n' f.readline() 'hello boy!n' f.readline() 'hello man!n' f.readline() '' f.flush() 将修改写入到文件中(无需关闭文件) ? 12 f.write('hello python!')f.flush() ? 1 [root@node1 python]# cat /tmp/test.txt ? 1234 hello girl!hello boy!hello man!hello python! f.tell() 获取指针位置 ? 123456789 f = open('/tmp/test.txt')f.readline() 'hello girl!n' f.tell() 12 f.readline() 'hello boy!n' f.tell() 23 四、内容查找和替换1、内容查找实例:统计文件中hello个数 思路:打开文件,遍历文件内容,通过正则表达式匹配关键字,统计匹配个数。 ? 1 [root@node1 ~]# cat /tmp/test.txt ? 1234 hello girl!hello boy!hello man!hello python! 脚本如下: 方法一: ? 12345678910 !/usr/bin/python import ref = open('/tmp/test.txt')source = f.read()f.close()r = r'hello's = len(re.findall(r,source))print s[root@node1 python]# python count.py4 方法二: ? 123456789101112 !/usr/bin/python import refp = file("/tmp/test.txt",'r')count = 0for s in fp.readlines():li = re.findall("hello",s)if len(li)>0:count = count + len(li)print "Search",count, "hello"fp.close()[root@node1 python]# python count1.pySearch 4 hello 2、替换实例:把test.txt 中的hello全部换为"hi",并把结果保存到myhello.txt中。 ? 1234567891011121314 !/usr/bin/python import ref1 = open('/tmp/test.txt')f2 = open('/tmp/myhello.txt','r+')for s in f1.readlines():f2.write(s.replace('hello','hi'))f1.close()f2.close()[root@node1 python]# touch /tmp/myhello.txt[root@node1 ~]# cat /tmp/myhello.txthi girl!hi boy!hi man!hi python! 实例:读取文件test.txt内容,去除空行和注释行后,以行为单位进行排序,并将结果输出为result.txt。test.txt 的内容如下所示: ? 12345678910111213141516171819 some words Sometimes in life,You find a special friend;Someone who changes your life just by being part of it.Someone who makes you laugh until you can't stop;Someone who makes you believe that there really is good in the world.Someone who convinces you that there really is an unlocked door just waiting for you to open it.This is Forever Friendship.when you're down,and the world seems dark and empty,Your forever friend lifts you up in spirits and makes that dark and empty worldsuddenly seem bright and full.Your forever friend gets you through the hard times,the sad times,and the confused times.If you turn and walk away,Your forever friend follows,If you lose you way,Your forever friend guides you and cheers you on.Your forever friend holds your hand and tells you that everything is going to be okay. 脚本如下: ? 12345678910 f = open('cdays-4-test.txt')result = list()for line in f.readlines(): # 逐行读取数据line = line.strip() #去掉每行头尾空白if not len(line) or line.startswith('#'): # 判断是否是空行或注释行continue #是的话,跳过不处理result.append(line) #保存result.sort() #排序结果print resultopen('cdays-4-result.txt','w').write('%s' % 'n'.join(result))

xuning715 2019-12-02 01:10:18 0 浏览量 回答数 0

回答

python 读写、创建 文件的方法: python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录:os.removedirs(r“c:python”) 检验给出的路径是否是一个文件:os.path.isfile() 检验给出的路径是否是一个目录:os.path.isdir() 判断是否是绝对路径:os.path.isabs() 检验给出的路径是否真地存:os.path.exists() 返回一个路径的目录名和文件名:os.path.split() eg os.path.split(‘/home/swaroop/byte/code/poem.txt’) 结果:(‘/home/swaroop/byte/code’, ‘poem.txt’) 分离扩展名:os.path.splitext() 获取路径名:os.path.dirname() 获取文件名:os.path.basename() 运行shell命令: os.system() 读取和设置环境变量:os.getenv() 与os.putenv() 给出当前平台使用的行终止符:os.linesep Windows使用’rn’,Linux使用’n’而Mac使用’r’ 指示你正在使用的平台:os.name 对于Windows,它是’nt’,而对于Linux/Unix用户,它是’posix’ 重命名:os.rename(old, new) 创建多级目录:os.makedirs(r“c:pythontest”) 创建单个目录:os.mkdir(“test”) 获取文件属性:os.stat(file) 修改文件权限与时间戳:os.chmod(file) 终止当前进程:os.exit() 获取文件大小:os.path.getsize(filename) 文件操作: os.mknod(“test.txt”) 创建空文件 fp = open(“test.txt”,w) 直接打开一个文件,如果文件不存在则创建文件 关于open 模式: w 以写方式打开, a 以追加模式打开 (从 EOF 开始, 必要时创建新文件) r+ 以读写模式打开 w+ 以读写模式打开 (参见 w ) a+ 以读写模式打开 (参见 a ) rb 以二进制读模式打开 wb 以二进制写模式打开 (参见 w ) ab 以二进制追加模式打开 (参见 a ) rb+ 以二进制读写模式打开 (参见 r+ ) wb+ 以二进制读写模式打开 (参见 w+ ) ab+ 以二进制读写模式打开 (参见 a+ ) fp.read([size]) #size为读取的长度,以byte为单位 fp.readline([size]) #读一行,如果定义了size,有可能返回的只是一行的一部分 fp.readlines([size]) #把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。 fp.write(str) #把str写到文件中,write()并不会在str后加上一个换行符 fp.writelines(seq) #把seq的内容全部写到文件中(多行一次性写入)。这个函数也只是忠实地写入,不会在每行后面加上任何东西。 fp.close() #关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。 如果一个文件在关闭后还对其进行操作会产生ValueError fp.flush() #把缓冲区的内容写入硬盘 fp.fileno() #返回一个长整型的”文件标签“ fp.isatty() #文件是否是一个终端设备文件(unix系统中的) fp.tell() #返回文件操作标记的当前位置,以文件的开头为原点 fp.next() #返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。 fp.seek(offset[,whence]) #将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。 fp.truncate([size]) #把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。 目录操作: os.mkdir(“file”) 创建目录 复制文件: shutil.copyfile(“oldfile”,”newfile”) oldfile和newfile都只能是文件 shutil.copy(“oldfile”,”newfile”) oldfile只能是文件夹,newfile可以是文件,也可以是目标目录 复制文件夹: shutil.copytree(“olddir”,”newdir”) olddir和newdir都只能是目录,且newdir必须不存在 重命名文件(目录) os.rename(“oldname”,”newname”) 文件或目录都是使用这条命令 移动文件(目录) shutil.move(“oldpos”,”newpos”) 删除文件 os.remove(“file”) 删除目录 os.rmdir(“dir”)只能删除空目录 shutil.rmtree(“dir”) 空目录、有内容的目录都可以删 转换目录 os.chdir(“path”) 换路径 Python读写文件 1.open 使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。 file_object = open(‘thefile.txt’) try: all_the_text = file_object.read( ) finally: file_object.close( ) 注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法。 2.读文件 读文本文件 input = open(‘data’, ‘r’) 第二个参数默认为r input = open(‘data’) 读二进制文件 input = open(‘data’, ‘rb’) 读取所有内容 file_object = open(‘thefile.txt’) try: all_the_text = file_object.read( ) finally: file_object.close( ) 读固定字节 file_object = open(‘abinfile’, ‘rb’) try: while True: chunk = file_object.read(100) if not chunk: break do_something_with(chunk) finally: file_object.close( ) 读每行 list_of_all_the_lines = file_object.readlines( ) 如果文件是文本文件,还可以直接遍历文件对象获取每行: for line in file_object: process line 3.写文件 写文本文件 output = open(‘data’, ‘w’) 写二进制文件 output = open(‘data’, ‘wb’) 追加写文件 output = open(‘data’, ‘w+’) 写数据 file_object = open(‘thefile.txt’, ‘w’) file_object.write(all_the_text) file_object.close( ) 写入多行 file_object.writelines(list_of_text_strings) 注意,调用writelines写入多行在性能上会比使用write一次性写入要高。 在处理日志文件的时候,常常会遇到这样的情况:日志文件巨大,不可能一次性把整个文件读入到内存中进行处理,例如需要在一台物理内存为 2GB 的机器上处理一个 2GB 的日志文件,我们可能希望每次只处理其中 200MB 的内容。 在 Python 中,内置的 File 对象直接提供了一个 readlines(sizehint) 函数来完成这样的事情。以下面的代码为例: file = open(‘test.log’, ‘r’)sizehint = 209715200 # 200Mposition = 0lines = file.readlines(sizehint)while not file.tell() - position < 0: position = file.tell() lines = file.readlines(sizehint) 每次调用 readlines(sizehint) 函数,会返回大约 200MB 的数据,而且所返回的必然都是完整的行数据,大多数情况下,返回的数据的字节数会稍微比 sizehint 指定的值大一点(除最后一次调用 readlines(sizehint) 函数的时候)。通常情况下,Python 会自动将用户指定的 sizehint 的值调整成内部缓存大小的整数倍。 file在python是一个特殊的类型,它用于在python程序中对外部的文件进行操作。在python中一切都是对象,file也不例外,file有file的方法和属性。下面先来看如何创建一个file对象: file(name[, mode[, buffering]]) file()函数用于创建一个file对象,它有一个别名叫open(),可能更形象一些,它们是内置函数。来看看它的参数。它参数都是以字符串的形式传递的。name是文件的名字。 mode是打开的模式,可选的值为r w a U,分别代表读(默认) 写 添加支持各种换行符的模式。用w或a模式打开文件的话,如果文件不存在,那么就自动创建。此外,用w模式打开一个已经存在的文件时,原有文件的内容会被清空,因为一开始文件的操作的标记是在文件的开头的,这时候进行写操作,无疑会把原有的内容给抹掉。由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个n,而在windows中是‘rn’,用U模式打开文件,就是支持所有的换行模式,也就说‘r’ ‘n’ ‘rn’都可表示换行,会有一个tuple用来存贮这个文件中用到过的换行符。不过,虽说换行有多种模式,读到python中统一用n代替。在模式字符的后面,还可以加上+ b t这两种标识,分别表示可以对文件同时进行读写操作和用二进制模式、文本模式(默认)打开文件。 buffering如果为0表示不进行缓冲;如果为1表示进行“行缓冲“;如果是一个大于1的数表示缓冲区的大小,应该是以字节为单位的。 file对象有自己的属性和方法。先来看看file的属性。 closed #标记文件是否已经关闭,由close()改写 encoding #文件编码 mode #打开模式 name #文件名 newlines #文件中用到的换行模式,是一个tuple softspace #boolean型,一般为0,据说用于print file的读写方法: F.read([size]) #size为读取的长度,以byte为单位 F.readline([size]) 读一行,如果定义了size,有可能返回的只是一行的一部分 F.readlines([size]) 把文件每一行作为一个list的一个成员,并返回这个list。其实它的内部是通过循环调用readline()来实现的。如果提供size参数,size是表示读取内容的总长,也就是说可能只读到文件的一部分。 F.write(str) 把str写到文件中,write()并不会在str后加上一个换行符 F.writelines(seq) 把seq的内容全部写到文件中。这个函数也只是忠实地写入,不会在每行后面加上任何东西。 file的其他方法: F.close() 关闭文件。python会在一个文件不用后自动关闭文件,不过这一功能没有保证,最好还是养成自己关闭的习惯。如果一个文件在关闭后还对其进行操作会产生ValueError F.flush() 把缓冲区的内容写入硬盘 F.fileno() 返回一个长整型的”文件标签“ F.isatty() 文件是否是一个终端设备文件(unix系统中的) F.tell() 返回文件操作标记的当前位置,以文件的开头为原点 F.next() 返回下一行,并将文件操作标记位移到下一行。把一个file用于for … in file这样的语句时,就是调用next()函数来实现遍历的。 F.seek(offset[,whence]) 将文件打操作标记移到offset的位置。这个offset一般是相对于文件的开头来计算的,一般为正数。但如果提供了whence参数就不一定了,whence可以为0表示从头开始计算,1表示以当前位置为原点计算。2表示以文件末尾为原点进行计算。需要注意,如果文件以a或a+的模式打开,每次进行写操作时,文件操作标记会自动返回到文件末尾。 F.truncate([size]) 把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。

元芳啊 2019-12-02 01:04:30 0 浏览量 回答数 0

问题

python多线程程序在末尾添加input()能运行,不添加就不能运行,求大神!?报错

爱吃鱼的程序员 2020-06-20 17:35:31 0 浏览量 回答数 1

回答

常用方法: 1、 通过sys模块获取程序参数 import sys def usage(): '''usage''' print 'Usage: %s %s %s %s' % (sys.argv[0], 'tokenid', 'Subject', 'Content') sys.exit() def main(): if len(sys.argv) != 4: usage() else: print(sys.argv[0]) print(sys.argv[1]) print(sys.argv[2]) print(sys.argv[3]) if name == "__main__": main() 运行脚本: D:Pythonmodules>python os_modules.pyUsage: os_modules.py tokenid Subject Content D:Pythonmodules>python os_modules.py aa bb ccos_modules.pyaabbccpython的sys模块默认是把第一个参数默认是程序本省,从第二个参数起都是代码后面跟着的参数,通过sys.arg[n]就可以获得传入到程序中的参数\ sys.stdinstdoutstderr 功能:stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们 sys.stdout 与print 当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了sys.stdout.write(obj+'n'),print 将你需要的内容打印到了控制台,然后追加了一个换行符,print 会调用 sys.stdout 的 write 方法 以下两行在事实上等价 import syssys.stdout.write("hello")print('hello') hellohello import syssys.stdout.write("hello n")print('hello') hello hello sys.stdin 与 raw_input import sysa = raw_input('raw_input_name: ')print(a)print 'stdin_name: ',b = sys.stdin.readline()print(b) raw_input_name: ;LIJUNJIANG ;LIJUNJIANG stdin_name: AAAA AAAA 从控制台重定向到文件 Import sysf_handler=open('out.log', 'w')sys.stdout=f_handlerprint 'hello' 在当前文件下新生成一个文件out.log,文件内容为hello, 捕获sys.exit(n)调用 功能:执行到主程序末尾,解释器自动退出,但是如果需要中途退出程序,可以调用sys.exit函数,带有一个可选的整数参数返回给调用它的程序,表示你可以在主程序中捕获对sys.exit的调用。(0是正常退出,其他为异常) def exitfunc(): print "hello world" sys.exitfunc = exitfunc # 设置捕获时调用的函数print "This exit test"sys.exit(1) # 退出自动调用exitfunc()后,程序依然退出了print "there" # 不会被 print结果:This exit testhello world exitfunc()函数,及当执行sys.exit(1)的时候,调用exitfunc()函数 sys.exit(1)后面的内容就不会执行了,因为程序已经退出

xuning715 2019-12-02 01:10:13 0 浏览量 回答数 0

问题

Python Django Rest框架无序对象列表

祖安文状元 2020-02-21 16:03:54 0 浏览量 回答数 1

问题

Python Pandas-从一张纸复制数据并在另一张纸的末尾追加

is大龙 2020-03-24 15:51:01 0 浏览量 回答数 1

回答

Python 正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。re 模块使 Python 语言拥有全部的正则表达式功能。compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。本章节主要介绍Python中常用的正则表达式处理函数。re.match函数re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。函数语法:re.match(pattern, string, flags=0)函数参数说明:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志匹配成功re.match方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。匹配对象方法 描述group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。实例 !/usr/bin/python -- coding: UTF-8 -- import reprint(re.match('www', 'www.runoob.com').span()) # 在起始位置匹配print(re.match('com', 'www.runoob.com')) # 不在起始位置匹配以上实例运行输出结果为:(0, 3)None实例 !/usr/bin/python import re line = "Cats are smarter than dogs" matchObj = re.match( r'(.) are (.?) .*', line, re.M|re.I) if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2)else: print "No match!!"以上实例执行结果如下:matchObj.group() : Cats are smarter than dogsmatchObj.group(1) : CatsmatchObj.group(2) : smarterre.search方法re.search 扫描整个字符串并返回第一个成功的匹配。函数语法:re.search(pattern, string, flags=0)函数参数说明:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。匹配成功re.search方法返回一个匹配的对象,否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配表达式。匹配对象方法 描述group(num=0) 匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。groups() 返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。实例 !/usr/bin/python -- coding: UTF-8 -- import reprint(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配以上实例运行输出结果为:(0, 3)(11, 14)实例 !/usr/bin/python import re line = "Cats are smarter than dogs"; searchObj = re.search( r'(.) are (.?) .*', line, re.M|re.I) if searchObj: print "searchObj.group() : ", searchObj.group() print "searchObj.group(1) : ", searchObj.group(1) print "searchObj.group(2) : ", searchObj.group(2)else: print "Nothing found!!"以上实例执行结果如下:searchObj.group() : Cats are smarter than dogssearchObj.group(1) : CatssearchObj.group(2) : smarterre.match与re.search的区别re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。实例 !/usr/bin/python import re line = "Cats are smarter than dogs"; matchObj = re.match( r'dogs', line, re.M|re.I)if matchObj: print "match --> matchObj.group() : ", matchObj.group()else: print "No match!!" matchObj = re.search( r'dogs', line, re.M|re.I)if matchObj: print "search --> matchObj.group() : ", matchObj.group()else: print "No match!!"以上实例运行结果如下:No match!!search --> matchObj.group() : dogs检索和替换Python 的 re 模块提供了re.sub用于替换字符串中的匹配项。语法:re.sub(pattern, repl, string, count=0, flags=0)参数:pattern : 正则中的模式字符串。repl : 替换的字符串,也可为一个函数。string : 要被查找替换的原始字符串。count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。实例 !/usr/bin/python -- coding: UTF-8 -- import re phone = "2004-959-559 # 这是一个国外电话号码" 删除字符串中的 Python注释 num = re.sub(r'#.*$', "", phone)print "电话号码是: ", num 删除非数字(-)的字符串 num = re.sub(r'D', "", phone)print "电话号码是 : ", num以上实例执行结果如下:电话号码是: 2004-959-559 电话号码是 : 2004959559repl 参数是一个函数以下实例中将字符串中的匹配的数字乘以 2:实例 !/usr/bin/python -- coding: UTF-8 -- import re 将匹配的数字乘以 2 def double(matched): value = int(matched.group('value')) return str(value * 2) s = 'A23G4HFD567'print(re.sub('(?Pd+)', double, s))执行输出结果为:A46G8HFD1134re.compile 函数compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。语法格式为:re.compile(pattern[, flags])参数:pattern : 一个字符串形式的正则表达式flags : 可选,表示匹配模式,比如忽略大小写,多行模式等,具体参数为:re.I 忽略大小写re.L 表示特殊字符集 w, W, b, B, s, S 依赖于当前环境re.M 多行模式re.S 即为 . 并且包括换行符在内的任意字符(. 不包括换行符)re.U 表示特殊字符集 w, W, b, B, d, D, s, S 依赖于 Unicode 字符属性数据库re.X 为了增加可读性,忽略空格和 # 后面的注释实例实例 import repattern = re.compile(r'd+') # 用于匹配至少一个数字m = pattern.match('one12twothree34four') # 查找头部,没有匹配print m None m = pattern.match('one12twothree34four', 2, 10) # 从'e'的位置开始匹配,没有匹配print m None m = pattern.match('one12twothree34four', 3, 10) # 从'1'的位置开始匹配,正好匹配print m # 返回一个 Match 对象 <_sre.SRE_Match object at 0x10a42aac0> m.group(0) # 可省略 0 '12' m.start(0) # 可省略 0 3 m.end(0) # 可省略 0 5 m.span(0) # 可省略 0 (3, 5)在上面,当匹配成功时返回一个 Match 对象,其中:group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0);start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认值为 0;end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数默认值为 0;span([group]) 方法返回 (start(group), end(group))。再看看一个例子:实例 import repattern = re.compile(r'([a-z]+) ([a-z]+)', re.I) # re.I 表示忽略大小写m = pattern.match('Hello World Wide Web')print m # 匹配成功,返回一个 Match 对象 <_sre.SRE_Match object at 0x10bea83e8> m.group(0) # 返回匹配成功的整个子串 'Hello World' m.span(0) # 返回匹配成功的整个子串的索引 (0, 11) m.group(1) # 返回第一个分组匹配成功的子串 'Hello' m.span(1) # 返回第一个分组匹配成功的子串的索引 (0, 5) m.group(2) # 返回第二个分组匹配成功的子串 'World' m.span(2) # 返回第二个分组匹配成功的子串 (6, 11) m.groups() # 等价于 (m.group(1), m.group(2), ...) ('Hello', 'World') m.group(3) # 不存在第三个分组 Traceback (most recent call last): File "", line 1, in IndexError: no such groupfindall在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表。注意: match 和 search 是匹配一次 findall 匹配所有。语法格式为:findall(string[, pos[, endpos]])参数:string : 待匹配的字符串。pos : 可选参数,指定字符串的起始位置,默认为 0。endpos : 可选参数,指定字符串的结束位置,默认为字符串的长度。查找字符串中的所有数字:实例 -- coding:UTF8 -- import re pattern = re.compile(r'd+') # 查找数字result1 = pattern.findall('runoob 123 google 456')result2 = pattern.findall('run88oob123google456', 0, 10) print(result1)print(result2)输出结果:['123', '456']['88', '12']re.finditer和 findall 类似,在字符串中找到正则表达式所匹配的所有子串,并把它们作为一个迭代器返回。re.finditer(pattern, string, flags=0)参数:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志实例 -- coding: UTF-8 -- import re it = re.finditer(r"d+","12a32bc43jf3") for match in it: print (match.group() ) 输出结果:12 32 43 3re.splitsplit 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:re.split(pattern, string[, maxsplit=0, flags=0])参数:参数 描述pattern 匹配的正则表达式string 要匹配的字符串。maxsplit 分隔次数,maxsplit=1 分隔一次,默认为 0,不限制次数。flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志实例 import rere.split('W+', 'runoob, runoob, runoob.')['runoob', 'runoob', 'runoob', '']re.split('(W+)', ' runoob, runoob, runoob.') ['', ' ', 'runoob', ', ', 'runoob', ', ', 'runoob', '.', ''] re.split('W+', ' runoob, runoob, runoob.', 1) ['', 'runoob, runoob, runoob.'] re.split('a*', 'hello world') # 对于一个找不到匹配的字符串而言,split 不会对其作出分割 ['hello world']正则表达式对象re.RegexObjectre.compile() 返回 RegexObject 对象。re.MatchObjectgroup() 返回被 RE 匹配的字符串。start() 返回匹配开始的位置end() 返回匹配结束的位置span() 返回一个元组包含匹配 (开始,结束) 的位置正则表达式修饰符 - 可选标志正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志:修饰符 描述re.I 使匹配对大小写不敏感re.L 做本地化识别(locale-aware)匹配re.M 多行匹配,影响 ^ 和 $re.S 使 . 匹配包括换行在内的所有字符re.U 根据Unicode字符集解析字符。这个标志影响 w, W, b, B.re.X 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。正则表达式模式模式字符串使用特殊的语法来表示一个正则表达式:字母和数字表示他们自身。一个正则表达式模式中的字母和数字匹配同样的字符串。多数字母和数字前加一个反斜杠时会拥有不同的含义。标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。反斜杠本身需要使用反斜杠转义。由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。模式元素(如 r't',等价于 '\t')匹配相应的特殊字符。下表列出了正则表达式模式语法中的特殊元素。如果你使用模式的同时提供了可选的标志参数,某些模式元素的含义会改变。模式 描述^ 匹配字符串的开头$ 匹配字符串的末尾。. 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。[...] 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'1 不在[]中的字符:2 匹配除了a,b,c之外的字符。re* 匹配0个或多个的表达式。re+ 匹配1个或多个的表达式。re? 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式re{ n} 精确匹配 n 个前面表达式。例如, o{2} 不能匹配 "Bob" 中的 "o",但是能匹配 "food" 中的两个 o。re{ n,} 匹配 n 个前面表达式。例如, o{2,} 不能匹配"Bob"中的"o",但能匹配 "foooood"中的所有 o。"o{1,}" 等价于 "o+"。"o{0,}" 则等价于 "o*"。re{ n, m} 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式a| b 匹配a或b(re) 匹配括号内的表达式,也表示一个组(?imx) 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。(?-imx) 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。(?: re) 类似 (...), 但是不表示一个组(?imx: re) 在括号中使用i, m, 或 x 可选标志(?-imx: re) 在括号中不使用i, m, 或 x 可选标志(?#...) 注释.(?= re) 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。(?! re) 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功(?> re) 匹配的独立模式,省去回溯。w 匹配字母数字及下划线W 匹配非字母数字及下划线s 匹配任意空白字符,等价于 [tnrf].S 匹配任意非空字符d 匹配任意数字,等价于 [0-9].D 匹配任意非数字A 匹配字符串开始Z 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。z 匹配字符串结束G 匹配最后匹配完成的位置。b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'erb' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。B 匹配非单词边界。'erB' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。n, t, 等. 匹配一个换行符。匹配一个制表符。等1...9 匹配第n个分组的内容。10 匹配第n个分组的内容,如果它经匹配。否则指的是八进制字符码的表达式。正则表达式实例字符匹配实例 描述python 匹配 "python".字符类实例 描述[Pp]ython 匹配 "Python" 或 "python"rub[ye] 匹配 "ruby" 或 "rube"[aeiou] 匹配中括号内的任意一个字母[0-9] 匹配任何数字。类似于 [0123456789][a-z] 匹配任何小写字母[A-Z] 匹配任何大写字母[a-zA-Z0-9] 匹配任何字母及数字3 除了aeiou字母以外的所有字符4 匹配除了数字外的字符特殊字符类实例 描述. 匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。d 匹配一个数字字符。等价于 [0-9]。D 匹配一个非数字字符。等价于 4。s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。S 匹配任何非空白字符。等价于 5。w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。W 匹配任何非单词字符。等价于 '6'。 Python 面向对象 Python CGI编程 1 篇笔记 jim 264*7522@qq.com正则表达式实例: !/usr/bin/python import reline = "Cats are smarter than dogs"matchObj = re.match( r'(.) are (.?) .*', line, re.M|re.I)if matchObj: print "matchObj.group() : ", matchObj.group() print "matchObj.group(1) : ", matchObj.group(1) print "matchObj.group(2) : ", matchObj.group(2) else: print "No match!!" 正则表达式:r'(.) are (.?) .*'解析:首先,这是一个字符串,前面的一个 r 表示字符串为非转义的原始字符串,让编译器忽略反斜杠,也就是忽略转义字符。但是这个字符串里没有反斜杠,所以这个 r 可有可无。 (.) 第一个匹配分组,. 代表匹配除换行符之外的所有字符。 (.?) 第二个匹配分组,.? 后面多个问号,代表非贪婪模式,也就是说只匹配符合条件的最少字符 后面的一个 .* 没有括号包围,所以不是分组,匹配效果和第一个一样,但是不计入匹配结果中。matchObj.group() 等同于 matchObj.group(0),表示匹配到的完整文本字符matchObj.group(1) 得到第一组匹配结果,也就是(.*)匹配到的matchObj.group(2) 得到第二组匹配结果,也就是(.*?)匹配到的因为只有匹配结果中只有两组,所以如果填 3 时会报错。 ... ↩ abc ↩ aeiou ↩ 0-9 ↩ fnrtv ↩ A-Za-z0-9_ ↩

xuning715 2019-12-02 01:10:40 0 浏览量 回答数 0

回答

一、Python文件读写的几种模式:r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢?1、文件使用方式标识'r':默认值,表示从文件读取数据。'w':表示要向文件写入数据,并截断以前的内容'a':表示要向文件写入数据,添加到当前内容尾部'r+':表示对文件进行可读写操作(删除以前的所有数据)'r+a':表示对文件可进行读写操作(添加到当前文件尾部)'b':表示要读写二进制数据2、读文件 进行读文件操作时,直到读到文档结束符(EOF)才算读取到文件最后,Python会认为字节x1A(26)转换成的字符为文档结束符(EOF), 故使用'r'进行读取二进制文件时,可能会出现文档读取不全的现象。 示例: 二进制文件中存在如下从低位向高位排列的数据:7F 32 1A 2F 3D 2C 12 2E 76 如果使用'r'进行读取,则读到第三个字节,即认为文件结束。 如果使用'rb'按照二进制位进行读取的,不会将读取的字节转换成字符,从而避免了上面的错误。 解决方案: 二进制文件就用二进制方法读取'rb' 总结: 使用'r'的时候,如果碰到'0x1A',就视为文件结束,就是EOF。使用'rb'则不存在这个问题, 即:如果你用二进制写入再用文件读出的话,如果其中存在'0x1A',就只会读出文件的一部分,使用'rb'会一直读取文件末尾。3、写文件 对于字符串x='abcndef',我们可用len(x)得到它的长度为7,n我们称之为换行符,实际上是0x0A。当我们用'w'即文本方式写的时候,在windows平台上会自动将'0x0A'变成两个字符'0x0D','0x0A',即文件长度实际上变成8。当用'r'文本方式读取时,又自动的转换成原来的换行符。 如果换成'wb'二进制方式来写的话,则会保持一个字符不变,读取的时候也是原样读取。 所以如果用文本方式写入,用二进制方式读取的话,就要考虑这多出的一个字节了。'0x0D'也称回车符。 Linux下不会变,因为linux只使用'0X0A'来表示换行。

xuning715 2019-12-02 01:10:33 0 浏览量 回答数 0

回答

open 函数可以打开一个文件。超级简单吧?大多数时候,我们看到它这样被使用: f = open('photo.jpg', 'r+') jpgdata = f.read() f.close() 我现在写这篇文章的原因,是大部分时间我看到open被这样使用。有三个错误存在于上面的代码中。你能把它们全指出来吗?如不能,请读下去。在这篇文章的结尾,你会知道上面的代码错在哪里,而且,更重要的是,你能在自己的代码里避免这些错误。现在我们从基础开始: open的返回值是一个文件句柄,从操作系统托付给你的Python程序。一旦你处理完文件,你会想要归还这个文件句柄,只有这样你的程序不会超出一次能打开的文件句柄的数量上限。 显式地调用close关闭了这个文件句柄,但前提是只有在read成功的情况下。如果有任意异常正好在f = open(...)之后产生,f.close()将不会被调用(取决于Python解释器的做法,文件句柄可能还是会被归还,但那是另外的话题了)。为了确保不管异常是否触发,文件都能关闭,我们将其包裹成一个with语句: with open('photo.jpg', 'r+') as f: jpgdata = f.read() open的第一个参数是文件名。第二个(mode 打开模式)决定了这个文件如何被打开。 - 如果你想读取文件,传入r - 如果你想读取并写入文件,传入r+ - 如果你想覆盖写入文件,传入w - 如果你想在文件末尾附加内容,传入a 虽然有若干个其他的有效的mode字符串,但有可能你将永远不会使用它们。mode很重要,不仅因为它改变了行为,而且它可能导致权限错误。举个例子,我们要是在一个写保护的目录里打开一个jpg文件, open(.., 'r+')就失败了。mode可能包含一个扩展字符;让我们还可以以二进制方式打开文件(你将得到字节串)或者文本模式(字符串) 一般来说,如果文件格式是由人写的,那么它更可能是文本模式。jpg图像文件一般不是人写的(而且其实不是人直接可读的),因此你应该以二进制模式来打开它们,方法是在mode字符串后加一个b(你可以看看开头的例子里,正确的方式应该是rb)。 如果你以文本模式打开一些东西(比如,加一个t,或者就用r/r+/w/a),你还必须知道要使用哪种编码。对于计算机来说,所有的文件都是字节,而不是字符。 可惜,在Pyhon 2.x版本里,open不支持显示地指定编码。然而,io.open函数在Python 2.x中和3.x(其中它是open的别名)中都有提供,它能做正确的事。你可以传入encoding这个关键字参数来传入编码。 如果你不传入任意编码,一个系统 - 以及Python -指定的默认选项将被选中。你也许被诱惑去依赖这个默认选项,但这个默认选项经常是错误的,或者默认编码实际上不能表达文件里的所有字符(这将经常发生在Python 2.x和/或Windows)。 所以去挑选一个编码吧。utf-8是一个非常好的编码。当你写入一个文件,你可以选一个你喜欢的编码(或者最终读你文件的程序所喜欢的编码)。 那你怎么找出正在读的文件是用哪种编码写的呢?好吧,不幸的是,并没有一个十分简单的方式来检测编码。在不同的编码中,同样的字节可以表示不同,但同样有效的字符。因此,你必须依赖一个元数据(比如,在HTTP头信息里)来找出编码。越来越多的是,文件格式将编码定义成UTF-8。 有了这些基础知识,我们来写一个程序,读取一个文件,检测它是否是JPG(提示:这些文件头部以字节FF D8开始),把对输入文件的描述写入一个文本文件。 import io with open('photo.jpg', 'rb') as inf: jpgdata = inf.read() if jpgdata.startswith(b'\xff\xd8'): text = u'This is a JPEG file (%d bytes long)\n' else: text = u'This is a random file (%d bytes long)\n' with io.open('summary.txt', 'w', encoding='utf-8') as outf: outf.write(text % len(jpgdata))

montos 2020-04-16 21:32:13 0 浏览量 回答数 0

问题

Python-将变量分配给sys.argv时,try / except不起作用

is大龙 2020-03-21 12:52:15 0 浏览量 回答数 1

回答

应用一些正则表达式并转换为rdd可能对您有用。 先使用textFile以下方法读取文件: a=spark.read.option('multiline',"true").text('aa.json')a.show(truncate=False) +-------------------------------------+ |value | +-------------------------------------+ |[[{"foo":"test1"},{"foo1":"test21"}],| |[{"foo":"test2"},{"foo1":"test22"}], | |[{"foo":"test3"},{"foo1":"test23"}]] | +-------------------------------------+ 现在我们可以使用pyspark.sql.functions.regexp_replace从每行中删除额外的方括号和尾随逗号: from pyspark.sql.functions import regexp_replacea = a.select(regexp_replace("value", "(^[(?=[))|((?<=])]$)|(,$)", "").alias("value"))a.show(truncate=False) +-----------------------------------+ |value | +-----------------------------------+ |[{"foo":"test1"},{"foo1":"test21"}]| |[{"foo":"test2"},{"foo1":"test22"}]| |[{"foo":"test3"},{"foo1":"test23"}]| +-----------------------------------+ 这里的模式是逻辑或以下模式: ^[(?=[):字符串开头后跟[[(第二[个是非捕获组)(?<=])]$:]]在字符串的末尾(第]一个是非捕获组),$:字符串末尾的逗号任何匹配的模式都将替换为空字符串。 现在转换为rdd并使用json.loads将行解析为字典列表。然后将所有这些字典合并到一个字典中并调用pyspark.sql.Row构造函数。最后调用.toDF转换回DataFrame。 From How to merge two dictionaries in a single expression? This code works for python 2 and 3 def merge_two_dicts(x, y): z = x.copy() # start with x's keys and values z.update(y) # modifies z with y's keys and values & returns None return z import jsonfrom pyspark.sql import Rowfrom functools import reduce a.rdd.map(lambda x: Row(**reduce(merge_two_dicts, json.loads(x['value'])))).toDF().show() +-----+------+ | foo| foo1| +-----+------+ |test1|test21| |test2|test22| |test3|test23| +-----+------+

社区小助手 2019-12-02 01:50:55 0 浏览量 回答数 0

回答

其实很简单: a[start:stop] # items start through stop-1 a[start:] # items start through the rest of the array a[:stop] # items from the beginning through stop-1 a[:] # a copy of the whole array 还有step值,可以和上面的任意一个一起使用: a[start:stop:step] # start through not past stop, by step 要记住的关键一点是:stop值表示不在所选切片中的第一个值。因此,stop和start之间的区别在于所选元素的数量(如果step是1,则为默认值)。 另一个特性是start或stop可能是负数,这意味着它从数组的末尾而不是从开头计数。所以: a[-1] # last item in the array a[-2:] # last two items in the array a[:-2] # everything except the last two items 同样,step也可以是负数: a[::-1] # all items in the array, reversed a[1::-1] # the first two items, reversed a[:-3:-1] # the last two items, reversed a[-3::-1] # everything except the last two items, reversed 如果项目比您要求的少,Python对程序员很友好。例如,如果您请求一个[:-2],而a只包含一个元素,那么您将得到一个空列表,而不是一个错误。有时您可能更喜欢错误,所以您必须意识到可能会发生这种情况。 实际上,在上面的代码中,切片操作符[]与slice()对象一起使用:符号(仅在[]中有效),即: a[start:stop:step] 等价于: a[slice(start, stop, step)] 根据参数的数量,Slice对象的行为也略有不同,类似于range(),即支持Slice (stop)和Slice (start, stop[, step])。 为了避免指定给定的参数,可以使用None,例如,[start:]等价于[slice(start, None)]或[::-1]等价于[slice(None, None, -1)]。 虽然:based表示法对于简单的切片非常有用,但是slice()对象的显式使用简化了切片的编程生成。

kun坤 2019-12-30 09:58:27 0 浏览量 回答数 0

回答

既然不知道什么是标准做法,因为这通常是不清楚和主观的,因此您可以尝试向模块本身寻求指导。通常,将with关键字用作其他用户的建议是一个不错的主意,但是在这种特定情况下,它可能无法提供预期的功能。 从模块的1.2.5版本开始,使用以下代码(github)MySQLdb.Connection实现上下文管理器协议: def enter(self): if self.get_autocommit(): self.query("BEGIN") return self.cursor() def exit(self, exc, value, tb): if exc: self.rollback() else: self.commit() 已经有一些现有的问答with,或者您可以阅读了解Python的“ with”语句,但是实质上发生的是__enter__在with块的开头__exit__执行,并在离开with块时执行。如果打算以后引用该对象,则可以使用可选的语法with EXPR as VAR将by返回的对象绑定 __enter__到名称。因此,在上述实现的基础上,这是查询数据库的一种简单方法: connection = MySQLdb.connect(...) with connection as cursor: # connection.enter executes at this line cursor.execute('select 1;') result = cursor.fetchall() # connection.exit executes after this line print result # prints "((1L,),)" 现在的问题是,退出with块后连接和游标的状态是什么?__exit__上面显示的方法仅调用self.rollback()或self.commit(),而这些方法都没有继续调用该close()方法。游标本身没有__exit__定义方法,也没有关系,因为with它只管理连接。因此,退出with块后,连接和游标都保持打开状态。通过在上面的示例中添加以下代码,可以很容易地确认这一点: try: cursor.execute('select 1;') print 'cursor is open;', except MySQLdb.ProgrammingError: print 'cursor is closed;', if connection.open: print 'connection is open' else: print 'connection is closed' 您应该看到输出到标准输出的“光标已打开;连接已打开”输出。 我相信您需要在提交连接之前关闭游标。 为什么?正如模块文档中所隐含的那样,作为基础的MySQL C APIMySQLdb没有实现任何游标对象:“ MySQL不支持游标;但是,游标易于仿真。” 实际上,MySQLdb.cursors.BaseCursor该类直接继承object于游标,并且对提交/回滚没有任何限制。Oracle开发人员曾这样说: 在cur.close()之前的cnx.commit()对我来说最合乎逻辑。也许您可以遵循以下规则:“如果不再需要,请关闭光标。” 因此,在关闭游标之前,先执行commit()。最后,对于Connector / Python而言,它并没有多大区别,但是对于其他数据库而言,则可能没有什么不同。 我希望这与您达到该主题的“标准实践”一样近。 查找不需要中间提交的事务集是否有任何显着的优势,这样您就不必为每个事务获取新的游标? 我对此非常怀疑,在尝试这样做时,您可能会引入其他人为错误。最好决定约定并坚持执行。 获取新的游标是否有很多开销,还是不重要? 开销可以忽略不计,完全不涉及数据库服务器;它完全在MySQLdb的实现中。如果您真的想知道创建新游标时发生了什么,可以在BaseCursor.__init__github上查看。 回到前面的讨论中with,也许现在您可以理解为什么MySQLdb.Connection类__enter__和__exit__方法在每个with块中为您提供了一个全新的游标对象,而不必理会它或在块末尾将其关闭。它相当轻巧,纯粹是为了您的方便而存在。 如果对微管理光标对象确实很重要,则可以使用contextlib.closing来弥补光标对象没有定义__exit__方法的事实。为此,还可以使用它强制连接对象在退出with块时自行关闭。这应该输出“ my_curs已关闭; my_conn已关闭”: from contextlib import closing import MySQLdb with closing(MySQLdb.connect(...)) as my_conn: with closing(my_conn.cursor()) as my_curs: my_curs.execute('select 1;') result = my_curs.fetchall() try: my_curs.execute('select 1;') print 'my_curs is open;', except MySQLdb.ProgrammingError: print 'my_curs is closed;', if my_conn.open: print 'my_conn is open' else: print 'my_conn is closed' 注意,with closing(arg_obj)不会调用参数对象的__enter__和__exit__方法。它只会close在with块的末尾调用参数对象的方法。(要查看实际情况,只需Foo使用__enter__,__exit__和close包含简单print语句的方法定义一个类,然后将执行时的操作with Foo(): pass与执行时的操作进行比较with closing(Foo()): pass。)这有两个重要的含义: 首先,如果启用了自动提交模式,则BEGIN当您with connection在块末尾使用并提交或回滚事务时,MySQLdb将在服务器上进行显式事务。这些是MySQLdb的默认行为,旨在保护您免受MySQL的立即提交任何DML语句的默认行为的影响。MySQLdb假定在使用上下文管理器时需要事务,并使用显式BEGIN绕过服务器上的自动提交设置。如果您习惯于使用with connection,您可能会认为自动提交实际上只是被绕过了而被禁用了。如果添加,可能会给您带来不愉快的惊喜closing您的代码并失去交易完整性;您将无法回滚更改,您可能会开始看到并发性错误,并且可能并不清楚为什么。 第二,with closing(MySQLdb.connect(user, pass)) as VAR结合的连接对象到VAR,在对比with MySQLdb.connect(user, pass) as VAR,其结合一个新的光标对象到VAR。在后一种情况下,您将无法直接访问连接对象!相反,您将必须使用游标的connection属性,该属性提供对原始连接的代理访问。关闭游标时,其connection属性设置为None。这将导致废弃的连接一直存在,直到发生以下情况之一: 删除所有对光标的引用 光标超出范围 连接超时 通过服务器管理工​​具手动关闭连接 您可以通过监视打开的连接(在Workbench中或使用SHOW PROCESSLIST)进行测试,同时一步一步地执行以下几行: with MySQLdb.connect(...) as my_curs: pass my_curs.close() my_curs.connection # None my_curs.connection.close() # throws AttributeError, but connection still open del my_curs # connection will close here来源:stack overflow

保持可爱mmm 2020-05-17 13:35:00 0 浏览量 回答数 0

回答

作为一个同时使用R和python的用户,我已经多次遇到过这种类型的问题。 在R中,它们有来自包tidyr的内置函数unnest。但是在Python(panda)中,没有针对这类问题的内置函数。 我知道对象列类型总是使数据难以转换成panda的函数。当我收到这样的数据时,首先想到的是“平铺”或取消列的嵌套。 对于这类问题,我使用了panda和python函数。如果您担心上述解决方案的速度,请检查user3483203的答案,因为他正在使用numpy,而且大多数时候numpy更快。如果速度对您很重要,我推荐Cpython和numba。 方法0[熊猫>= 0.25] 从panda 0.25开始,如果你只需要爆炸一列,你可以使用爆炸函数: df.explode('B') A B 0 1 1 1 1 2 0 2 1 1 2 2 方法1 应用+ pd。系列(容易理解,但在性能方面不推荐)。 df.set_index('A').B.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'B'}) Out[463]: A B 0 1 1 1 1 2 0 2 1 1 2 2 方法2 对DataFrame构造函数使用repeat,重新创建您的DataFrame(擅长性能,不擅长多列) df=pd.DataFrame({'A':df.A.repeat(df.B.str.len()),'B':np.concatenate(df.B.values)}) df Out[465]: A B 0 1 1 0 1 2 1 2 1 1 2 2 方法2.1 例如,除了A,我们还有A。如果我们仍然使用上面的方法(方法2),我们就很难一个一个地重新创建列。 解决方案:在“取消嵌套”单个列之后加入或合并索引 s=pd.DataFrame({'B':np.concatenate(df.B.values)},index=df.index.repeat(df.B.str.len())) s.join(df.drop('B',1),how='left') Out[477]: B A 0 1 1 0 2 1 1 1 2 1 2 2 如果需要的列顺序与前面完全相同,请在末尾添加reindex。 s.join(df.drop('B',1),how='left').reindex(columns=df.columns) 方法3 重新创建列表 pd.DataFrame([[x] + [z] for x, y in df.values for z in y],columns=df.columns) Out[488]: A B 0 1 1 1 1 2 2 2 1 3 2 2 如果超过两列,则使用 s=pd.DataFrame([[x] + [z] for x, y in zip(df.index,df.B) for z in y]) s.merge(df,left_on=0,right_index=True) Out[491]: 0 1 A B 0 0 1 1 [1, 2] 1 0 2 1 [1, 2] 2 1 1 2 [1, 2] 3 1 2 2 [1, 2] 方法4 使用重索引或loc df.reindex(df.index.repeat(df.B.str.len())).assign(B=np.concatenate(df.B.values)) Out[554]: A B 0 1 1 0 1 2 1 2 1 1 2 2 #df.loc[df.index.repeat(df.B.str.len())].assign(B=np.concatenate(df.B.values)) 方法5 当列表只包含唯一的值时: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[3,4]]}) from collections import ChainMap d = dict(ChainMap(*map(dict.fromkeys, df['B'], df['A']))) pd.DataFrame(list(d.items()),columns=df.columns[::-1]) Out[574]: B A 0 1 1 1 2 1 2 3 2 3 4 2 方法6 使用numpy实现高性能: newvalues=np.dstack((np.repeat(df.A.values,list(map(len,df.B.values))),np.concatenate(df.B.values))) pd.DataFrame(data=newvalues[0],columns=df.columns) A B 0 1 1 1 1 2 2 2 1 3 2 2 方法7 使用基本函数itertools循环和链:纯粹的python解决方案只是为了好玩 from itertools import cycle,chain l=df.values.tolist() l1=[list(zip([x[0]], cycle(x[1])) if len([x[0]]) > len(x[1]) else list(zip(cycle([x[0]]), x[1]))) for x in l] pd.DataFrame(list(chain.from_iterable(l1)),columns=df.columns) A B 0 1 1 1 1 2 2 2 1 3 2 2 泛化为多个列 df=pd.DataFrame({'A':[1,2],'B':[[1,2],[3,4]],'C':[[1,2],[3,4]]}) df Out[592]: A B C 0 1 [1, 2] [1, 2] 1 2 [3, 4] [3, 4] Self-def功能: def unnesting(df, explode): idx = df.index.repeat(df[explode[0]].str.len()) df1 = pd.concat([ pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1) df1.index = idx return df1.join(df.drop(explode, 1), how='left') unnesting(df,['B','C']) Out[609]: B C A 0 1 1 1 0 2 2 1 1 3 3 2 1 4 4 2 以上方法都是关于垂直反嵌套和爆炸,如果你需要扩展列表水平,检查pd。DataFrame构造函数 df.join(pd.DataFrame(df.B.tolist(),index=df.index).add_prefix('B_')) Out[33]: A B C B_0 B_1 0 1 [1, 2] [1, 2] 1 2 1 2 [3, 4] [3, 4] 3 4 更新的功能 def unnesting(df, explode, axis): if axis==1: idx = df.index.repeat(df[explode[0]].str.len()) df1 = pd.concat([ pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1) df1.index = idx return df1.join(df.drop(explode, 1), how='left') else : df1 = pd.concat([ pd.DataFrame(df[x].tolist(), index=df.index).add_prefix(x) for x in explode], axis=1) return df1.join(df.drop(explode, 1), how='left') 测试输出 unnesting(df, ['B','C'], axis=0) Out[36]: B0 B1 C0 C1 A 0 1 2 1 2 1 1 3 4 3 4 2

kun坤 2019-12-27 10:25:01 0 浏览量 回答数 0

问题

模块在没有明确指示的情况下重新加载和重置

is大龙 2020-03-24 09:35:04 0 浏览量 回答数 1

回答

一、字符串的创建 test = str() / ""test = str("licheng") / "licheng"无参数,创建空字符串一个参数,创建普通字符串两个参数,int(字节,编码)二、字符串的常用方法 复制代码 capitalize():字符串首字符大写 string = 'this is a string.'new_str = string.capitalize()print(new_str) 输出:This is a string. center(width, fillchar=None):将字符串放在中间,在指定长度下,首尾以指定字符填充 string = 'this is a string.'new_str = string.center(30,'*')print(new_str) 输出:this is a string.* count(sub, start=None, end=None):计算字符串中某字符的数量 string = 'this is a string.'new_str = string.count('i')print(new_str) 输出:3 decode/encode(encoding=None, errors=None):解码/解码 string = 'this is a string.'new_str = string.decode()new_str = string.encode()print(new_str) endswith(self, suffix, start=None, end=None):判断是否以某字符结尾 string = 'this is a string.'new_str = string.endswith('ing.')print(new_str) 输出:True find(self, sub, start=None, end=None):在字符串中寻找指定字符的位置 string = 'this is a string.'new_str = string.find('a') #找的到的情况print(new_str) 输出:8 new_str = string.find('xx') #找不到的情况返回-1print(new_str) 输出:-1 index(self, sub, start=None, end=None):;类似find string = 'this is a string.'new_str = string.index('a') #找的到的情况print(new_str) 输出:8 new_str = string.index('xx') #找不到的情况,程序报错print(new_str) 输出:程序运行报错,ValueError: substring not found isalnum(self):判断字符串中是否都是数字和字母,如果是则返回True,否则返回False string = 'My name is yue,my age is 18.'new_str = string.isalnum()print(new_str) 输出:False string = 'haha18121314lala'new_str = string.isalnum()print(new_str) 输出:True isalpha(self):判断字符串中是否都是字母,如果是则返回True,否则返回False string = 'abcdefg'new_str = string.isalpha()print(new_str) 输出:True string = 'my name is yue'new_str = string.isalpha() #字母中间带空格、特殊字符都不行print(new_str) 输出:False isdigit(self):判断字符串中是否都是数字,如果是则返回True,否则返回False string = '1234567890'new_str = string.isdigit()print(new_str) 输出:True string = 'haha123lala'new_str = string.isdigit() #中间带空格、特殊字符都不行print(new_str) 输出:False islower(self):判断字符串中的字母是否都是小写,如果是则返回True,否则返回False string = 'my name is yue,my age is 18.'new_str = string.islower()print(new_str) 输出:True string = 'My name is Yue,my age is 18.'new_str = string.islower()print(new_str) 输出:False isupper(self):检测字符串中所有的字母是否都为大写。 string = 'MY NAME IS YUE.'new_str = string.isupper()print(new_str) 输出:True string = 'My name is Yue.'new_str = string.isupper()print(new_str) 输出:False join(self, iterable):将序列中的元素以指定的字符连接生成一个新的字符串。 string = ("haha","lala","ohoh")str = "-"print(str.join(string)) 输出:haha-lala-ohoh lower(self):转换字符串中所有大写字符为小写。 string = "My Name is YUE."print(string.lower()) 输出:my name is yue. lstrip(self, chars=None):截掉字符串左边的空格或指定字符。 string = " My Name is YUE."print(string.lstrip()) 输出:My Name is YUE. string = "My Name is YUE."print(string.lstrip('My')) 输出: Name is YUE. replace(self, old, new, count=None):把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次。 string = "My name is yue."print(string.replace("yue","ying")) 输出:My name is ying. rfind(self, sub, start=None, end=None):返回字符串最后一次出现的位置,如果没有匹配项则返回-1。 string = "My name is yue."print(string.rfind('is')) 输出:8 string = "My name is yue."print(string.rfind('XXX')) 输出:-1 split(self, sep=None, maxsplit=None):通过指定分隔符对字符串进行切片。 string = "haha lala gege"print(string.split(' ')) 输出:['haha', 'lala', 'gege'] print(string.split(' ', 1 )) 输出: ['haha', 'lala gege'] rsplit(self, sep=None, maxsplit=None):通过指定分隔符对字符串从右进行切片。 string = "haha lala gege"print(string.rsplit(' ')) 输出:['haha', 'lala', 'gege'] print(string.rsplit(' ', 1 )) 输出: ['haha lala', 'gege'] rstrip(self, chars=None):删除 string 字符串末尾的指定字符(默认为空格). string = " My name is yue. "print(string.rstrip()) 输出: My name is yue. strip(self, chars=None):移除字符串头尾指定的字符(默认为空格)。 string = " My name is yue. "print(string.strip()) 输出:My name is yue. upper(self):将字符串中的小写字母转为大写字母。 string = "my name is yue,my age is 18."print(string.upper()) 输出:MY NAME IS YUE,MY AGE IS 18. 复制代码 str源码三、字符串的公共功能 索引(只能取一个元素)切片(取多个元素)长度(len)python2:按字节算长度python3:按字符算长度for循环(同长度的版本循环单位)四、字符与字节的转换 复制代码 将gbk编码的字符转化为字节 s = "李程"b = bytes(s, encoding="gbk")type(b) 输出为字节类型 将字节转化为字符 c = str(b, encoding="gbk")复制代码五、字符串格式化 Python的字符串格式化有两种方式: 百分号方式、format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。 1、百分号方式 %(name)[width].[precision]typecode 参数详解常用格式化: 复制代码tpl = "i am %s" % "spark" tpl = "i am %s age %d" % ("spark", 18) tpl = "i am %(name)s age %(age)d" % {"name": "spark", "age": 18} tpl = "percent %.2f" % 99.97623 tpl = "i am %(pp).2f" % {"pp": 123.425556, } tpl = "i am %.2f %%" % {"pp": 123.425556, }复制代码2、Format方式 [[fill]align]sign0,[type] 参数详解 常用格式化: 复制代码 1 tpl = "i am {}, age {}, {}".format("seven", 18, 'alex') 2 3 tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex']) 4 5 tpl = "i am {0}, age {1}, really {0}".format("seven", 18) 6 7 tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18]) 8 9 tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18)10 11 tpl = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18})12 13 tpl = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])14 15 tpl = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1)16 17 tpl = "i am {:s}, age {:d}".format(*["seven", 18])18 19 tpl = "i am {name:s}, age {age:d}".format(name="seven", age=18)20 21 tpl = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18})22 23 tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)24 25 tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)26 27 tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)28 29 tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)

xuning715 2019-12-02 01:10:45 0 浏览量 回答数 0

问题

wttr.in 一个 Python 实现的命令行查看天气工具

huc_逆天 2020-05-21 19:12:17 19 浏览量 回答数 1

回答

$("#Loading").before(txt); txt里大概就是图片的代码吧###### if (allstop == true) { $(window).scroll(function () {######你看不到他后台/ajax/casesList.ajax是如何实现的,这部分是服务器端,你通过网页看到的只是get请求,可以在调试的network部分看到请求方式。如果你想测试你可以尝试用命令行的curl去测试,但是你看不到服务器端的代码,因为他不是开源的###### 引用来自“剑心无痕”的评论 你看不到他后台/ajax/casesList.ajax是如何实现的,这部分是服务器端,你通过网页看到的只是get请求,可以在调试的network部分看到请求方式。如果你想测试你可以尝试用命令行的curl去测试,但是你看不到服务器端的代码,因为他不是开源的 我用f12观察了一下,其中XHR中默认是一个也没有,后来不断的加载,共有三个casesList.aspx 这种情况说明了什么呢? 还有一个问题,她似乎让显示的每一页只有24条记录,以后随着请求的加载,不断的输出后续的记录,如何使每一页保持24条记录呢,如何用sql来控制呢? ######还有忘记说了,后端源码是部署在服务器上,你是看不到的是安全的,前端的js,css,html都是开源的,是不安全的,所以操作数据库尽量不要用js######如果你想了解后段是如何实现的,可以稍微学习一些后段的知识,这里他是用asp.net写的后端,其实用js也可以写后端,不过目前主流的后端框架都是php,python,ruby,asp等的,我个人的理解,后段主要是做复杂的逻辑运算和数据库交互(数据库js也可以直接访问的),然后前后端之间的通信主要是两种,一种是这里的post,get等请求,一种是模板######$("#loading").before(txt);断点在这里的话,你可以看到txt就是有24个li标签的字符串,每次都会把txt添加到id是loading的前面,你看html里loading的前面其实就是li标签,所以实际上就是在现有li标签的末尾添加txt###### 引用来自“ziluopao”的评论 引用来自“剑心无痕”的评论 你看不到他后台/ajax/casesList.ajax是如何实现的,这部分是服务器端,你通过网页看到的只是get请求,可以在调试的network部分看到请求方式。如果你想测试你可以尝试用命令行的curl去测试,但是你看不到服务器端的代码,因为他不是开源的 我用f12观察了一下,其中XHR中默认是一个也没有,后来不断的加载,共有三个casesList.aspx 这种情况说明了什么呢? 还有一个问题,她似乎让显示的每一页只有24条记录,以后随着请求的加载,不断的输出后续的记录,如何使每一页保持24条记录呢,如何用sql来控制呢? 我又观察了一下f12,发现other选项中,有一个不断变化的动态页面,估计这个页面就是后端中的代码吧,当然它不是原码,但毕竟能看出变化来! 还有一个问题,下图中绿色箭头指的东西是不是代码中的,还是说f12强加上去便于解析呢? ######看上去有点像调用的baidu的api,具体的还得你自己去研究研究######手机上面看不到图片,电脑才看到你的图片,绿色箭头是请求的响应吧,headers里能看到请求的信息,估计是在某个地方调用的这个请求,具体可以在源码中搜索一下###### 我有点明白了,它是通过"pageIndex": pageIndex, "category_id": category_id和后端中的代码联系的,这两个参数在后端源码中肯定有######回复 @剑心无痕 : 是这样,我正好想请教你,他的代码怎么出现在百度商桥中了,这是玩的啥技术!?######是的,就是把这两个参数通过post传递到后端,然后获取后端返回的txt,还有刚才查了一下,貌似是百度商桥的api,有兴趣你可以自己查看一下###### 可不可以这样推理,他把代码写在百度商桥中是为了便于百度收录?我是这样想的,其实这种延迟加载技术不利于优化,似乎作者想通过百度商桥弥补一下,不知对不对,不过我真想不出这么做能弥补吗?###### 还有一个问题需要提出:后端如何一次输出五个格式为txt的li呢,只有这样ajax才能一下输出五个li来

爱吃鱼的程序员 2020-05-31 00:19:29 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板