Easily parse the VCF and extract TEL properties into a CSV with columns for name, phone type and number. Command line: Use grep "^TEL" contacts.vcf to list all phone numbers instantly. No code: Import VCF to Google Contacts, then export as CSV and filter the phone columns. All methods extract phone numbers from VCF files with different levels of detail.
Introduction
VCF files store phone numbers in TEL properties, but extracting them is not as simple as opening the file in Excel. A VCF file with 500 contacts may contain over 1,000 phone numbers spread across work, home, cell and fax types, mixed with hundreds of other properties like names, emails and addresses. You need a way to pull out just the phone numbers, ideally paired with the contact name and phone type.
This guide covers four methods to extract phone numbers from a VCF file, from a Python script that outputs a clean CSV with name, type and number columns to a one-line grep command for quick extraction. If you need to extract email addresses instead, see our extract emails from VCF guide. For a full conversion to spreadsheet format, see VCF to CSV.
We have built VCF extraction tools at Univik since 2013 and parse TEL properties from vCard exports across all major platforms, handling the inconsistent type labels that different contact apps use.
How Phone Numbers Are Stored in VCF
The TEL property in a VCF file includes type parameters that indicate whether a number is work, home, cell or fax. Different vCard versions and platforms use different syntax for these types.
| VCF Syntax | Type | Source |
|---|---|---|
| TEL;TYPE=CELL:+1-555-0123 | Mobile | Standard vCard 3.0/4.0 |
| TEL;TYPE=WORK:+1-555-0456 | Work | Standard vCard 3.0/4.0 |
| TEL;TYPE=HOME:+1-555-0789 | Home | Standard vCard 3.0/4.0 |
| TEL;TYPE=FAX:+1-555-0321 | Fax | Standard vCard 3.0/4.0 |
| TEL;TYPE=IPHONE:+1-555-0123 | iPhone | Apple Contacts (non-standard) |
| TEL;TYPE=pref:+1-555-0123 | Preferred | Various (marks primary number) |
| TEL;CELL:+1-555-0123 | Mobile | vCard 2.1 (no TYPE= prefix) |
A single contact can have multiple TEL properties (work, cell, home). Because of this, the Python script in Method 1 extracts all of them with their types. If you only need a quick list, the grep method extracts all TEL lines without type parsing.
4 Methods to Extract Phone Numbers from VCF
Method 1: Python Script (Name + Number CSV)
This method produces a CSV file with three columns: Contact Name, Phone Type, and Phone Number. It is the most useful output because you can see which number belongs to which person.
1
Install vobject: pip install vobject
2
Save the following as extract_phones.py:
import vobject, csv, sys
vcf_file = sys.argv[1] if len(sys.argv) > 1 else "contacts.vcf"
with open(vcf_file, "r", encoding="utf-8") as f:
  vcf_data = f.read()
rows = []
for card in vobject.readComponents(vcf_data):
  name = card.fn.value if hasattr(card, "fn") else "Unknown"
  if not hasattr(card, "tel"): continue
  tels = card.contents.get("tel", [])
  for tel in tels:
    number = tel.value
    ptype = "Other"
    params = tel.params.get("TYPE", [])
    if params:
      ptype = ", ".join(p for p in params if p.upper() != "VOICE")
    if not ptype: ptype = "Other"
    rows.append([name, ptype, number])
with open("phone_numbers.csv", "w", newline="", encoding="utf-8") as f:
  w = csv.writer(f)
  w.writerow(["Name", "Phone Type", "Phone Number"])
  w.writerows(sorted(rows))
print(f"Extracted {len(rows)} phone numbers to phone_numbers.csv")
3
Run it: python extract_phones.py contacts.vcf
The output is a phone_numbers.csv file sorted alphabetically by name. Each row contains one phone number, so contacts with multiple numbers appear on multiple rows. The Phone Type column shows CELL, WORK, HOME, FAX or the original type label from the VCF file.
Method 2: Command Line grep/PowerShell (Quick List)
For a quick list of all phone numbers without contact names, grep extracts every TEL line from the VCF file in one command. However, this method does not pair numbers with contact names.
1
Mac/Linux: grep "^TEL" contacts.vcf | sed 's/.*://' > phones.txt
This extracts all TEL lines and strips everything before the colon, leaving just the phone numbers in phones.txt.
2
Windows PowerShell: Select-String "^TEL" contacts.vcf | ForEach-Object { ($_ -split ":")[-1] } > phones.txt
This achieves the same result on Windows. The output is a plain text file with one phone number per line, which you can then import into a spreadsheet or use for bulk operations.
Method 3: Google Contacts Export (No Code)
If you do not want to use scripts or command-line tools, Google Contacts provides a visual way to extract phone numbers.
1
Import VCF to Google Contacts. Go to contacts.google.com, click Import and upload your VCF file. See our import VCF to Google Contacts guide for details.
2
Export as Google CSV. Select the imported contacts, click Export, choose “Google CSV”. Open the CSV in Excel or Google Sheets.
3
Filter the phone columns. The CSV includes columns like “Phone 1 – Value”, “Phone 1 – Type”, “Phone 2 – Value”, etc. Delete all columns except Name and Phone columns to get your phone number list.
Method 4: VCF Converter Tool (GUI)
A dedicated VCF converter tool with phone extraction provides a graphical interface. Load the VCF file, select “Extract Phone Numbers” as the output option and save the results to CSV or TXT. This is the simplest option for non-technical users who need to extract phone numbers from large VCF files without writing code.
Output Format Options
| Output Format | Content | Best For |
|---|---|---|
| CSV (name + type + number) | Three columns: Name, Phone Type, Number | CRM import, mail merge, contact management |
| CSV (numbers only) | One column: Phone Number | Bulk SMS, call lists, deduplication |
| TXT (one per line) | Plain text, one number per line | Script input, quick reference |
| Excel (.xlsx) | Formatted spreadsheet with filters | Business reporting, team distribution |
The Python script (Method 1) produces the name + type + number CSV by default. To get numbers only, modify the script to write only rows.append([number]) instead of including name and type.
Method Comparison Table
| Criteria | Python Script | grep/PowerShell | Google Contacts | Converter Tool |
|---|---|---|---|---|
| Contact name paired | Yes | No | Yes | Yes |
| Phone type extracted | Yes (CELL/WORK/HOME) | No | Yes | Varies |
| Multiple numbers per contact | Yes (all TEL) | Yes | Yes | Yes |
| Custom output format | Full control | Text only | CSV only | CSV/TXT |
| Technical skill | Medium | Low-Medium | None | None |
| Best for | Complete extraction | Quick count/list | Non-developers | Bulk GUI |
Phone Number Formatting and Normalization
Phone numbers in VCF files often have inconsistent formatting. For example, the same number may appear as +1-555-012-3456, (555) 012-3456, 15550123456, or 555.012.3456 depending on the source. If you need consistent formatting for CRM import or bulk SMS, then normalize the numbers after extraction.
1
Strip non-digit characters. In Python, use import re; clean = re.sub(r"[^0-9+]", "", number) to remove dashes, spaces, parentheses, and dots. Keep the leading + for international format.
2
Add country code if missing. If numbers do not start with + or a country code, prepend the default country code. For US numbers, add +1 to 10-digit numbers. For India, add +91 to 10-digit numbers. In Excel, use an IF formula to check the length and prepend the code.
3
Remove duplicates. After normalization, sort the list and remove duplicate numbers. Two contacts may have the same number stored with different formatting (555-0123 vs 5550123). Normalizing first ensures duplicates are caught.
Common Problems and Fixes
Some contacts show no phone number even though they have one. The VCF file may use a TEL property format that the parser does not recognize. Open the file in a text editor and search for “TEL” to see the actual syntax. Some older phones store numbers as TEL;CELL;VOICE:+1555 (vCard 2.1 style without TYPE=). The vobject library handles most variations, but custom formats may require manual regex parsing.
Phone numbers lose leading zeros when opened in Excel. Excel interprets phone numbers as numeric values and strips leading zeros (turning 00441234 into 441234). To prevent this, format the Phone Number column as Text before opening the CSV, or add a leading apostrophe (‘00441234) in the CSV output. The Python script outputs numbers as text strings, but Excel may still reinterpret them.
The grep method includes the TEL property line, not just the number. The sed command (sed 's/.*://') strips everything before the last colon. If the TEL line has multiple colons (rare), use grep -oP '(?<=:)[\d\s+\-().]+' contacts.vcf to extract only the number portion.
Contacts have phone numbers but no name (shows “Unknown”). Some VCF contacts lack an FN (full name) property, especially from WhatsApp exports or shared contacts. The script labels these as “Unknown”. To identify them, cross-reference the extracted phone numbers with a full VCF to CSV conversion where other fields like ORG or EMAIL may provide context.
Frequently Asked Questions
How do I extract only mobile numbers from a VCF file?
Modify the Python script to filter by phone type. Add a condition: if "CELL" in [p.upper() for p in params]: before appending the row. This skips work, home and fax numbers and outputs only mobile/cell numbers.
Can I extract phone numbers and email addresses together?
Yes. Combine the logic from this guide with our email extraction guide. In the Python script, check for both card.contents.get("tel") and card.contents.get("email") and output Name, Email, Phone Type, and Phone Number in the same CSV.
How many phone numbers can a single VCF contact have?
There is no limit. A single contact can have dozens of TEL properties (work direct, work main, cell personal, cell work, home, fax, pager). The Python script extracts all of them, creating one CSV row per phone number.
Can I extract phone numbers from multiple VCF files at once?
Yes. Merge the VCF files into one first, then run the extraction script on the merged file. On the command line, use cat *.vcf > all.vcf (Mac/Linux) or copy *.vcf all.vcf (Windows) to merge, then extract.
What is the VOICE type in VCF phone numbers?
VOICE is a default type that many contact apps add automatically (TEL;TYPE=CELL,VOICE). It means the number supports voice calls (as opposed to fax or data). The Python script in Method 1 filters out VOICE from the type display because it adds no useful information. Virtually all phone numbers are voice-capable.
Conclusion
Last verified: February 2026. Python script tested with vobject 0.9.7 on Python 3.12. grep tested on macOS 14, Ubuntu 24.04, and Windows 11 PowerShell 7. VCF files tested from iCloud, Google Contacts, Outlook, Samsung, WhatsApp and Android exports across vCard 2.1, 3.0 and 4.0.
To extract phone numbers from a VCF file, the Python script (Method 1) produces a clean CSV with name, phone type, and number columns. For a quick list without names, the grep command (Method 2) extracts all numbers in one line. Google Contacts (Method 3) provides a visual no-code approach and a VCF converter tool (Method 4) handles bulk extraction with a graphical interface.
Three things to remember: contacts can have multiple phone numbers (the script extracts all of them, not just the first), normalize the formatting before using numbers for CRM import or bulk SMS, and filter out VOICE from type labels because it appears on almost every number and provides no useful distinction.