用python写程序的一些小积累(3)

本文是作者在学习Python过程中的一些积累,包括如何读取多个txt文件、理解yield()函数、解决爬虫中文乱码问题、判断数字开头的字符串以及去除换行符和特殊字符的方法。同时,分享了在网页爬虫中处理u3000等字符的经验。
摘要由CSDN通过智能技术生成

  看了别人写的博客后的一点感想:花一早上看了python教程和爬虫教程博客,写的巨长,期间好几次忍不住去玩手机了。看别人写的博客适合短平快的学习:当你了解一个知识的时候,去看看别人写的这方面的博客可以当成复习或查漏补缺、或者新手入门、或者遇到bug怎么解决。如果想要系统的了解知识还是建议找几本好书看看。为什么csdn上这么多教程了,或许我写的这些别人早就写过了,我还要写吗?那我岂不是做了知识的搬运工?但我觉得还是有必要写一写自己学习过程的总结,给自己看,遇到相同问题的时候能够很容易查找到解决办法。

1. 文件夹中有多个txt文件,怎么读取里面的数据

  1. 将多个txt文件里的内容进行合并
# -*- coding:utf-8 -*- 
#os模块中包含很多操作文件和目录的函数 
import os 

#获取目标文件夹的路径 
meragefiledir = os.getcwd()+'\\MerageFiles'
#获取当前文件夹中的文件名称列表 
filenames=os.listdir(meragefiledir) 
#打开当前目录下的result.txt文件,如果没有则创建
file=open('result.txt','w') 
#向文件中写入字符 
  
#先遍历文件名 
for filename in filenames: 
	filepath=meragefiledir+'\\'
	filepath=filepath+filename
 	#遍历单个文件,读取行数 
	for line in open(filepath): 
		file.writelines(line) 
	file.write('\n') 
#关闭文件 
file.close()
  1. 如果只是想读取每个文件的内容再进行数据处理的话,可以用startswith进行判断。
path = 'result2/'
file_names = os.listdir(path)
for file in file_names:
	if file.startswith('link_1'):
		pass
	elif file.startswith('link_2'):
		pass
	else:
		continue

2. yield()函数

yield()函数是创建生成器的一种方式。前面总结过用列表推导式来创建列表,但将[]改为()后就可以创建生成器了。

a = (i for i in range(5) if i > 3)
print(a)             # <generator object <genexpr> at 0x00000196A1AAF948>
print(next(a))       # 4
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        print(b)
        a, b = b, a + b 
        n = n + 1
fab(5)
>>> 1
	1
	2
	3
	5
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b     # 将print换成yield
        a, b = b, a + b 
        n = n + 1
f = fab(5)
print(f)    # <generator object fab at 0x000001651F91FC48>
print(next(f))   # 1
for i in f:    # 通过遍历将生成器中的元素打印出
    print(i)
>>> 1
    1
    2
    3
    5

通过上面的代码可以体会到yield()不是一下子把程序执行完,而是返回一个生成器,当用next()或循环调用一次就执行一次,碰到yield()之后返回值,如果再调用,那就从上一步yield断开的地方再执行,直到再次遇到yield()。

换一个更容易看出区别的例子:

def fun():
    a = 10
    while 1:
        a += 1
        yield a


b = fun()
print(next(b))
print(next(b))
print(next(b))

>>> 11
    12
    13

如果将yield a 换成print(a),程序就会陷入死循环。这就体现了yeild()利用资源的优势了。

3. python爬取内容出现中文乱码的解决方法

出现中文乱码的原因是因为源网页编码不是‘utf-8’,我尝试了这个博客的第1第2种方法,第一种虽然可以解决乱码变正常码的问题,但是原来正常码的变为乱码了。第二种方法完美解决。第三种编码再解码在爬虫中很常用,但我觉得有亿点点麻烦。
参考博客如下:Python爬取网站返回的内容为乱码解决方法

4. python怎么判断字符串是否以数字开头?

之前写过用str.startswith(‘xxx’)或str.endswith(‘xxx’)来判断字符串是以什么字符开头和结尾的,但是有个问题是:如果这些字符串的开头和结尾都是变化的数字怎么处理(变化的字母也同理)?用str.startswith(‘xxx’)把所有的情况都罗列一遍么?[笑cry]

link = '03243'
if link[0].isdigit():
	print('yes')

判断是否以字母开头:str[0].isalpha()

5. 如何去除换行符\n以及制表符\t等等?

之后会对正则进行总结,但我先挑一些我遇到的问题,以及怎么解决的。说去除其实是用空格进行替换。

5.1 re.sub()

import re

text = '今天\n很\n开心'
# print(text)
# >>> 今天
#     很
#     开心

a = re.sub(r'\n', '', text)       # 去掉了所有的\n 
# print(a)         # 今天很开心

b = text.replace(r'\n', '')
# print(b)
# >>> 今天
#     很
#     开心

c = text.replace(r'今天', '天天')
print(c)
# >>> 天天
#     很
#     开心

从上面的例子可以看到str.replace()与re.sub()的区别。

5.2 re模块怎么批量替换字符串中的多个字符?

import re
s = '“你好啊,_我是小黑@*$”'
parttern = re.compile('“|”|,|_|@|\*|\$')  # | 表示或者的意思
print(re.sub(parttern, '', s))  # 替换掉s里面的满足parttern格式的字符为空白字符
# >>> 你好啊我是小黑

6. 网页爬虫中出现\u3000等字符怎么去除?

import unicodedata
s = 'T-shirt\xa0\xa0短袖圆领衫,\u3000体恤衫\xa0买一件\t吧'
print(unicodedata.normalize('NFKC', s))
# >>> T-shirt  短袖圆领衫, 体恤衫 买一件      吧

我用到的是unicodedata模块提供的normalize方法,还有其它几种方法,比如使用上面的re.sub()等等,但这种方法是处理这种情况最好的方法。
参考资料:网页爬虫中\xa0、\u3000等字符的解释及去除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值