聪明办法学python chap6 字符串

发布时间 2023-11-30 08:54:43作者: yao-ziyan

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
一些字符串方法
  1. type()函数:可以返回对象的类型,可以通过比较type(x)==type(‘a’)的值来判断某个变量是否为字符串类型。

  2. isinstance()函数:可以判断一个对象是否为指定的类型,例如isinstance(x, str)可以判断x是否为字符串类型。

  3. str.isalnum()方法:可以判断字符串是否只包含字母和数字。

  4. str.isalpha()方法:可以判断字符串是否只包含字母。

  5. str.isdigit()方法:可以判断字符串是否只包含数字。

  6. str.islower()方法:可以判断字符串中的字母是否都为小写。

  7. str.isupper()方法:可以判断字符串中的字母是否都为大写。

  8. str.isspace()方法:可以判断字符串是否只包含空格。

  9. 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

  1. 使用print语句:在代码中添加print语句,输出变量的值或者程序执行到哪一步,来判断程序的执行情况
  2. 使用pdb模块:pdb是Python自带的调试器,可以在代码中添加断点,以及在断点处查看变量的值,单步执行代码等
  3. 使用IDE:常用的Python IDE,如PyCharm、VS Code等都提供了调试功能,可以方便地设置断点、查看变量值、单步执行代码等
  4. 使用第三方调试器:如Winpdb、PyDev等,这些调试器可以在代码中设置断点,查看变量值,单步执行代码