看了别人写的博客后的一点感想:花一早上看了python教程和爬虫教程博客,写的巨长,期间好几次忍不住去玩手机了。看别人写的博客适合短平快的学习:当你了解一个知识的时候,去看看别人写的这方面的博客可以当成复习或查漏补缺、或者新手入门、或者遇到bug怎么解决。如果想要系统的了解知识还是建议找几本好书看看。为什么csdn上这么多教程了,或许我写的这些别人早就写过了,我还要写吗?那我岂不是做了知识的搬运工?但我觉得还是有必要写一写自己学习过程的总结,给自己看,遇到相同问题的时候能够很容易查找到解决办法。
目录
1. 文件夹中有多个txt文件,怎么读取里面的数据
- 将多个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()
- 如果只是想读取每个文件的内容再进行数据处理的话,可以用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等字符的解释及去除