Python(六) 字符串
引号的作用将文字包裹,告诉python这是个字符串,单引号 ' 和双引号 “ 最常见的
使用两种引号的作用
print('He said, "Hello, world!"') # 输出:He said, "Hello, world!"
字符串中换行符号
print("Data\nWhale") #Data
print('''Data #Whale
Whale''')
print('''你好\ #你好haha
haha''')
转义符号
print("双引号\"") #"
print("双引号\\") #\
print("d\\a\"t\ta") #转义序列只作为一个字符存在len("d\\a\"t\ta")==7
一些字符串常量
import string
print(string.ascii_letters)#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ print(string.ascii_lowercase)#abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)#ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.digits)#0123456789
print(string.punctuation)#!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print(string.printable)#abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print(string.whitespace)#' \t\n\r\x0b\x0c'
字符串运算
加乘
print("abc"+"def") #abcdef
print("abc"*3) #abcabcabc
print("abc"+3) #字符串和整数不能直接相加.正确将3为字符串类型后再加,即print("abc"+str(3)),输出结果为abc3
in运算
print("ring" in "string") #Ture
print("wow" in "amazing") #False
print("聪明" in "聪明办法学python") #Ture
字符串索引和切片
- 索引
s = "datawhale"
print(s) #datawhale
print(s[0]) #d
print(s[len(s)-1]) #e 取最后一个字符串
print(s[-1]) #e
print(s[len(s)]) #IndexError: string index out of range
- 切片
print(s[start:final:step])
print(s[0:4]) #data(左闭右开)
print(s[4:9]) #whale
print(s[:4]) #data(左边默认为0,右边默认为-1)
print(s[1:4:2]) #aa
#反转字符串
print(s[::-1]) #1 #elahwatad
print("".join(reserved(s))#2
def reserveString(s): #3
return s[::-1]
print(reserveString(n))
zip(a, b) split()循环
for i in s: #in可以把所有可以用 【索引】 表示的数循环出来
print(i)
for idx, c in enumerate(s): #0 d 1 a ~~~
print(idx, c)
#zip(a, b)可以在一次循环中,分别从a和b同时取出一个元素
for idx, (a, b) in enumerate(zip(s, reverseString(s))):
print(idx, a, b) #0 d e \1 a l
#split()循环 (.split()本身会产生一个叫列表的东西,但它不存储任何内容)
class_name = "learn python the smart way"
for word in class_name.split():
print(word) # learn \n python \n the \n smart \n way
class_name.split() #['learn','python','the','smart','way']
str = "hello\nworld\r\npython" #splitlines()它用于将字符串按照行分隔
lines = str.splitlines()
print(lines) # 输出:['hello', 'world', 'python']
字符串相关的一些内置函数
str() len()
chr() ord()用于将字符转换为ASCII码和将ASCII码转换为字符。
print(chr(65)) # 输出:A
ord()函数接受一个字符参数,返回对应的ASCII码
print(ord('A')) # 输出:65
如果给ord()函数传递的是一个字符串参数,那么它只会返回第一个字符的ASCII码
print(ord('ABC')) # 输出:65
一些字符串方法
-
type()函数:可以返回对象的类型,可以通过比较type(x)==type(‘a’)的值来判断某个变量是否为字符串类型。
-
isinstance()函数:可以判断一个对象是否为指定的类型,例如isinstance(x, str)可以判断x是否为字符串类型。
-
str.isalnum()方法:可以判断字符串是否只包含字母和数字。
-
str.isalpha()方法:可以判断字符串是否只包含字母。
-
str.isdigit()方法:可以判断字符串是否只包含数字。
-
str.islower()方法:可以判断字符串中的字母是否都为小写。
-
str.isupper()方法:可以判断字符串中的字母是否都为大写。
-
str.isspace()方法:可以判断字符串是否只包含空格。
-
str = "www.runoob.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字符中的大写字母转换成小写字母 print(str.capitalize()) # 把第一个字母转化为大写字母,其余小写 print(str.title()) # 把每个单词的第一个字母转化为大写,其余小写
print("YYDS".lower()) #yyds
print("yyds".upper()) #YYDS
print(" strip() 可以将字符串首尾的空格删掉 ".strip())#strip() 可以将字符串首尾的空格删掉
print("聪明办法学python".replace("python","C")) #聪明办法学C
print("聪明办法学python python".replace("python","C",1)) #聪明办法学C python
print("this is a hihstory test".count("is")) #3
print("Dogs and cats".startswitch("Do")) #Ture以Do开头
print("Dogs and cats".endswitch("cats")) #Ture以cats结尾
print("Dogs and cats".find("and")) #5
print("Dogs and cats".find("or")) #-1 没找到,返回-1
print("Dogs and cats".index("and")) #5
print("Dogs and cats".find("or")) #ValueError: substring not found
字符串是不可变的,所以它的别名也是不可变的
s = "datawhale"
s[3] = "e" #TypeError: 'str' object does not support item assignment
s = "data" #s引用了字符串“data”
t = s #t只是“data”的一个只读别名
s += "whale" #s = s+
print(s) #datawhale
print(t) #data
读和写文件
open() 将会返回一个 file 对象,基本语法格式如下:
open(filename, mode)
- filename:包含了你要访问的文件名称的字符串值。
- mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
以下实例将字符串写入到文件 foo.txt 中:
实例
f = open("/tmp/foo.txt", "w") # 打开一个文件
f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )
f.close() # 关闭打开的文件
此时打开文件 foo.txt,显示如下:
$ cat /tmp/foo.txt
Python 是一个非常好的语言。
是的,的确非常好!!
文件对象的方法
假设已经创建了一个称为 f 的文件对象
-
f.read()
为了读取一个文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
f = open("/tmp/foo.txt", "r")
str = f.read()
print(str)
f.close()
#Python 是一个非常好的语言。
#是的,的确非常好!!
-
f.readline()
f.readline() 会从文件中读取单独的一行。换行符为 '\n'。f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行。
f = open("/tmp/foo.txt", "r")
str = f.readline()
print(str)
f.close()
#Python 是一个非常好的语言。
-
f.readlines()
f.readlines() 将返回该文件中包含的所有行。
如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割。
f = open("/tmp/foo.txt", "r")
str = f.readlines()
print(str)
f.close()
#['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']
另一种方式是迭代一个文件对象然后读取每行:
f = open("/tmp/foo.txt", "r")
for line in f:
print(line, end='')
f.close()
#Python 是一个非常好的语言。
#是的,的确非常好!!
-
f.write()
f.write(string) 将 string 写入到文件中, 然后返回写入的字符数。
f = open("/tmp/foo.txt", "w")
num = f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )
print(num)
f.close()
#29
如果要写入一些不是字符串的东西, 那么将需要先进行转换:
f = open("/tmp/foo1.txt", "w")
value = ('www.runoob.com', 14)
s = str(value)
f.write(s)
f.close()
#$ cat /tmp/foo1.txt
#('www.runoob.com', 14)
-
f.tell()
f.tell() 返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数。
-
f.seek()
如果要改变文件指针当前的位置, 可以使用 f.seek(offset, from_what) 函数。
from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
from_what 值为默认为0,即文件开头。下面给出一个完整的例子:
>>> f = open('/tmp/foo.txt', 'rb+')
>>> f.write(b'0123456789abcdef')
16
>>> f.seek(5) # 移动到文件的第六个字节
5
>>> f.read(1)
b'5'
>>> f.seek(-3, 2) # 移动到文件的倒数第三字节
13
>>> f.read(1)
b'd'
-
f.close()
在文本文件中 (那些打开文件的模式下没有 b 的), 只会相对于文件起始位置进行定位。
当你处理完一个文件后, 调用 f.close() 来关闭文件并释放系统的资源,如果尝试再调用该文件,则会抛出异常。
>>> f.close()
>>> f.read()
# ValueError: I/O operation on closed file
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:
>>> with open('/tmp/foo.txt', 'r') as f:
... read_data = f.read()
>>> f.closed
True
文件对象还有其他方法, 如 isatty() 和 trucate(), 但这些通常比较少用。
with语句
with open()
是Python中用于打开文件的一种更安全、更简洁的方式。使用with open()
可以自动关闭文件,无论在处理文件时是否发生错误。
with open('example.txt', 'w') as f:
f.write('Hello, world!')
为Python程序Debug
- 使用print语句:在代码中添加print语句,输出变量的值或者程序执行到哪一步,来判断程序的执行情况
- 使用pdb模块:pdb是Python自带的调试器,可以在代码中添加断点,以及在断点处查看变量的值,单步执行代码等
- 使用IDE:常用的Python IDE,如PyCharm、VS Code等都提供了调试功能,可以方便地设置断点、查看变量值、单步执行代码等
- 使用第三方调试器:如Winpdb、PyDev等,这些调试器可以在代码中设置断点,查看变量值,单步执行代码