Форматирование телефонных номеров - CSV и Regex - PullRequest
0 голосов
/ 20 апреля 2020

Я только начинаю с Python, поэтому я пытаюсь поиграть с несколькими вещами, чтобы продолжить обучение. Я вытащил и распечатал указанные c данные, необходимые из файла CSV. Но все телефонные номера печатаются в разных форматах. Как я могу распечатать их в одном и том же формате, как, скажем, ххх-ххх-хххх?

import csv
import re

with open("customerdata.csv", "r") as csvfile:
   reader = csv.DictReader(csvfile)
   for row in reader:
       if row['Purchases Past 6 Months'] > "0":
           phone = row['Phone']
           print(row['Name'] ,"|" ,row['Gender'] ,"|" ,row['State'] ,"|" ,row['Credit Card'] ,"|" ,row['Phone'] ,"|" ,row['Spent Past 6 Months'] ,"\n")

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Вероятно, не самый чистый способ, но вы можете создать функцию для форматирования так, как вы хотите:

def formatPhoneNbStr(num_str):
    digits = ""
    for c in num_str:
        if(c.isdigit()):
            digits = c+digits
    return digits[0:3]+"-"+ digits[3:6]+"-" + digits[6:]
0 голосов
/ 20 апреля 2020

После:

phone = row['Phone']

добавить:

phone = re.sub(r'[^\d]', '', phone) # removes everything except digits
assert len(phone)==10               # ensures all numbers have 10 digits
row['Phone'] = re.sub(r'(\d{3})(\d{3})(\d{4})', r'\1-\2-\3', phone) # formats the string

Или без re модуля:

phone = ''.join(c for c in phone if c.isdigit())
row['Phone'] = '-'.join([ phone[0:3], phone[3:6], phone[6:] ])

Кстати, я бы также рекомендовал заменить это :

print(row['Name'] ,"|" ,row['Gender'] ,"|" ,row['State'] ,"|" ,row['Credit Card'] ,"|" ,row['Phone'] ,"|" ,row['Spent Past 6 Months'] 

с:

fields = ['Name','Gender','State','Credit Card','Phone','Spent Past 6 Months'] 
print('|'.join((row[field] for field in fields)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...