我有一大串肮脏的CSV,里面有各种格式的电话号码。我想要的是梳理他们的所有,并导出到一个单一列CSV清洁电话号码,以一种简单的格式。到目前为止,我已经拼凑了一些有用的东西,尽管它有一些问题:(下面的部分修改)
import csv
import re
import glob
import string
with open('phonelist.csv', 'wb') as out:
seen = set()
output = []
out_writer = csv.writer(out)
csv_files = glob.glob('CSVs\*.csv')
for filename in csv_files:
with open(filename, 'rbU') as ifile:
read = csv.reader(ifile)
for row in read:
for column in row:
s1 = column.strip()
if re.match(r'\b\d\d\d\d\d\d\d\d\d\d\b', s1):
if s1 not in seen:
seen.add(s1)
output.append(s1)
elif re.search(r'\b\(\d\d\d\) \d\d\d-\d\d\d\d\b', s1):
s2 = filter(lambda x: x in string.digits, s1)
if s2 not in seen:
seen.add(s2)
output.append(s2)
for val in output:
out_writer.writerow([val])我把这些放在一起,没有任何正式的python知识,只是拼凑我在这个网站上收集到的东西。任何关于丙酮化或利用熊猫图书馆作为捷径的建议都是受欢迎的。
第一个问题:筛选到匹配值的最简单方法是什么?呃,我可能会得到9815556667 John Smith,但我只想要号码。
第二期:这需要很长时间。我猜这是兰巴的一部分。有没有更快或更有效的方法?
第三个问题:我如何在程序目录和CSVs目录(如所写的那样)中显示*.csv?
我知道这一次有好几个问题,但我已经问到一半了。任何额外的指针都将不胜感激。
例如,请求,这不是来自一个文件(这些是多千兆字节文件),但是下面是我要寻找的:
John Smith, (981) 991-0987, 9987765543 extension 541, 671 Maple St 98402
(998) 222-0011, 13949811123, Foo baR Us, 2567 Appleberry Lane
office, www.somewebpage.com, City Group, Anchorage AK
9281239812
(345) 666-7777应成为:
9819910987
9987765543
9982220011
3949811123
3456667777(我忘记了,我也需要从11位数中去掉一个领先1)
编辑:我已经修改了我的当前代码,以纳入Shahram的建议,因此,现在,从上面的for column in row,我得到了,而不是上面的:
for column in row:
s1 = column.strip()
result = re.match(
r'.*(\+?[2-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)? ?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1) or re.match(
r'.*(\+?[2-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)?-?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1)
if result:
tempStr = result.group(1)
for ch in ['(', ')', '-', ' ']:
tempStr = tempStr.replace(ch, '')
if tempStr not in seen:
seen.add(tempStr)
output.append(tempStr)这似乎符合我的目的,但我仍然不知道如何浏览当前的目录和子目录,我仍然不知道我的代码是否有问题,因为我的hodge-podge-ing是我不知道的。而且,在我更大的目录中,这需要花费很长时间--就像在20分钟左右,大约有一组CSV在为我计时(用我的手)。我不知道它是否遇到了麻烦,但从蟒蛇通常咬穿任何数量的CSV的速度来判断,我感觉好像错过了什么东西。
发布于 2014-02-03 23:02:23
关于第一个问题,您可以使用下面的正则表达式来捕获不同类型的电话号码:
result = re.match(r'.*(\+?[0-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)?-?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1)
if result:
if result.group(1) not in seen:
seen.add(result.group(1))
output.append(result.group(1))关于你的第二个问题:你可能想看看替换函数。因此,上面的代码可以更改为:
result = re.match(r'.*(\+?[0-9]?[0-9]?[0-9]?-?\(?[0-9][0-9][0-9]\)?-?[0-9][0-9][0-9]-?[0-9][0-9][0-9][0-9]).*', s1)
if result:
if result.group(1) not in seen:
tempStr = result.group(1)
tempStr.replace('-','')
seen.add(tempStr)
output.append(tempStr)https://stackoverflow.com/questions/21538978
复制相似问题