最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)獲取手機(jī)通訊錄文件并導(dǎo)出為excel

 更新時(shí)間:2026年01月06日 09:49:53   作者:高山莫衣  
這篇文章主要為大家詳細(xì)介紹了如何通過Python實(shí)現(xiàn)獲取手機(jī)通訊錄文件并導(dǎo)出為excel表格,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

核心功能與解決的實(shí)際問題

這段代碼的核心功能是解析從手機(jī)導(dǎo)出的VCF格式通訊錄文件,并將其中的聯(lián)系人信息(如姓名、電話號(hào)碼、郵箱等)轉(zhuǎn)換并保存為結(jié)構(gòu)清晰、易于編輯的Excel表格。它專門解決了VCF文件(vCard格式)用文本編輯器查看雜亂無章、無法直接篩選或批量編輯的痛點(diǎn),使得備份的通訊錄數(shù)據(jù)變得可讀、可管理。

完整的聯(lián)系人信息提取與導(dǎo)出流程

程序能夠系統(tǒng)性地遍歷VCF文件,識(shí)別每個(gè)以"BEGIN:VCARD"開始、“END:VCARD"結(jié)束的聯(lián)系人數(shù)據(jù)塊,并從中提取關(guān)鍵字段。解析出的信息會(huì)結(jié)構(gòu)化地存入數(shù)據(jù)集合,最后利用pandas庫生成包含"姓名”、“電話”、"郵箱"等列的Excel文件(.xlsx格式),確保所有聯(lián)系信息一目了然,方便后續(xù)的查找、編輯或?qū)肫渌O(shè)備。

實(shí)現(xiàn)代碼

import vobject
import chardet
import pandas as pd
import os

def debug_vcf_file(file_path):
    """
    調(diào)試VCF文件:檢查編碼、文件結(jié)構(gòu)和內(nèi)容
    """
    print("=== 開始調(diào)試VCF文件 ===")
    
    # 檢查文件是否存在
    if not os.path.exists(file_path):
        print(f"錯(cuò)誤:文件 '{file_path}' 不存在")
        return False
    
    # 檢查文件大小
    file_size = os.path.getsize(file_path)
    print(f"文件大小: {file_size} 字節(jié)")
    
    if file_size == 0:
        print("錯(cuò)誤:文件為空")
        return False
    
    # 讀取原始字節(jié)數(shù)據(jù)
    with open(file_path, 'rb') as f:
        raw_data = f.read()
    
    # 檢測(cè)編碼
    encoding_result = chardet.detect(raw_data)
    detected_encoding = encoding_result['encoding']
    confidence = encoding_result['confidence']
    
    print(f"檢測(cè)到的編碼: {detected_encoding} (置信度: {confidence:.2f})")
    
    # 嘗試不同編碼
    encodings_to_try = [detected_encoding, 'gbk', 'gb2312', 'utf-8', 'iso-8859-1']
    
    for encoding in encodings_to_try:
        if not encoding:
            continue
        try:
            content = raw_data.decode(encoding)
            print(f"? 成功使用 {encoding} 編碼解碼")
            
            # 檢查VCF基本結(jié)構(gòu)
            if 'BEGIN:VCARD' in content and 'END:VCARD' in content:
                vcard_count = content.count('BEGIN:VCARD')
                print(f"找到 {vcard_count} 個(gè)聯(lián)系人卡片")
                
                # 顯示前500個(gè)字符作為樣本
                sample = content[:500]
                print("文件內(nèi)容樣本:")
                print("---" + sample + "---")
                
                return True, content, encoding
            else:
                print(f"× 使用 {encoding} 解碼但未找到VCARD結(jié)構(gòu)")
                
        except UnicodeDecodeError as e:
            print(f"× {encoding} 編碼解碼失敗: {e}")
        except Exception as e:
            print(f"× {encoding} 處理過程中出錯(cuò): {e}")
    
    # 最后嘗試忽略錯(cuò)誤模式
    try:
        content = raw_data.decode('utf-8', errors='ignore')
        print("最后嘗試:使用UTF-8忽略錯(cuò)誤模式解碼")
        return True, content, 'utf-8 (errors ignored)'
    except Exception as e:
        print(f"最終解碼失敗: {e}")
        return False, None, None

def parse_vcf_with_debug(file_path):
    """
    解析VCF文件并生成Excel表格
    """
    # 調(diào)試文件
    debug_result, vcf_content, used_encoding = debug_vcf_file(file_path)
    
    if not debug_result:
        print("文件調(diào)試失敗,無法繼續(xù)解析")
        return []
    
    contacts = []
    print(f"\n=== 開始解析VCF內(nèi)容(使用編碼: {used_encoding})===")
    
    try:
        # 分割vCard塊
        vcard_blocks = vcf_content.split('BEGIN:VCARD')
        
        for i, block in enumerate(vcard_blocks):
            if not block.strip() or 'END:VCARD' not in block:
                continue
                
            # 重新構(gòu)建完整的vCard
            vcard_text = 'BEGIN:VCARD' + block
            
            try:
                vcard = vobject.readOne(vcard_text)
                contact_info = {'序號(hào)': i}
                
                # 提取姓名
                if hasattr(vcard, 'fn') and vcard.fn:
                    contact_info['姓名'] = str(vcard.fn.value)
                    print(f"聯(lián)系人 {i}: 找到姓名 - {vcard.fn.value}")
                else:
                    contact_info['姓名'] = '未知'
                    print(f"聯(lián)系人 {i}: 未找到姓名字段")
                
                # 提取電話
                contact_info['電話'] = ''
                if hasattr(vcard, 'tel'):
                    phones = []
                    if isinstance(vcard.tel, list):
                        for tel in vcard.tel:
                            if hasattr(tel, 'value') and tel.value:
                                phones.append(str(tel.value))
                    elif hasattr(vcard.tel, 'value') and vcard.tel.value:
                        phones.append(str(vcard.tel.value))
                    
                    if phones:
                        contact_info['電話'] = '; '.join(phones)
                        print(f"聯(lián)系人 {i}: 找到電話 - {phones}")
                    else:
                        print(f"聯(lián)系人 {i}: 找到TEL字段但值為空")
                
                # 提取其他信息
                if hasattr(vcard, 'email'):
                    emails = []
                    if isinstance(vcard.email, list):
                        for email in vcard.email:
                            if email.value:
                                emails.append(str(email.value))
                    elif vcard.email.value:
                        emails.append(str(vcard.email.value))
                    contact_info['郵箱'] = '; '.join(emails) if emails else ''
                
                contacts.append(contact_info)
                print(f"? 成功解析聯(lián)系人 {i}: {contact_info['姓名']}")
                
            except Exception as e:
                print(f"× 解析聯(lián)系人 {i} 時(shí)出錯(cuò): {e}")
                # 打印出錯(cuò)的vCard內(nèi)容前200字符用于調(diào)試
                print(f"錯(cuò)誤vCard樣本: {vcard_text[:200]}")
                continue
                
    except Exception as e:
        print(f"解析過程中出現(xiàn)嚴(yán)重錯(cuò)誤: {e}")
    
    return contacts

def save_contacts_to_excel(contacts, output_file='contacts.xlsx'):
    """
    將聯(lián)系人保存到Excel文件
    """
    if not contacts:
        print("沒有聯(lián)系人數(shù)據(jù)可保存")
        return False
    
    try:
        # 創(chuàng)建DataFrame
        df = pd.DataFrame(contacts)
        
        # 重新排列列順序
        columns_order = ['序號(hào)', '姓名', '電話', '郵箱']
        existing_columns = [col for col in columns_order if col in df.columns]
        df = df[existing_columns]
        
        # 保存到Excel
        df.to_excel(output_file, index=False, engine='openpyxl')
        print(f"? 成功生成Excel文件: {output_file}")
        print(f"? 共保存 {len(contacts)} 個(gè)聯(lián)系人")
        
        # 顯示前幾行作為預(yù)覽
        print("\n前5個(gè)聯(lián)系人預(yù)覽:")
        print(df.head())
        
        return True
        
    except Exception as e:
        print(f"× 生成Excel文件時(shí)出錯(cuò): {e}")
        return False

# 主執(zhí)行函數(shù)
def main():
    vcf_file_path = "你的通訊錄.vcf"  # 請(qǐng)?zhí)鎿Q為您的VCF文件路徑
    
    print("手機(jī)VCF聯(lián)系人解析工具")
    print("=" * 50)
    
    # 解析VCF文件
    contacts_list = parse_vcf_with_debug(vcf_file_path)
    
    if contacts_list:
        # 生成Excel文件
        save_contacts_to_excel(contacts_list)
        
        print(f"\n解析完成!成功處理 {len(contacts_list)} 個(gè)聯(lián)系人")
    else:
        print("\n解析失敗,未找到有效聯(lián)系人")

if __name__ == "__main__":
    main()

效果如下:

以上就是Python實(shí)現(xiàn)獲取手機(jī)通訊錄文件并導(dǎo)出為excel的詳細(xì)內(nèi)容,更多關(guān)于Python獲取手機(jī)通訊錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pandas中case_when()方法使用小結(jié)

    Pandas中case_when()方法使用小結(jié)

    本文主要介紹了Pandas中case_when()方法使用小結(jié),它可以用于條件性地創(chuàng)建新的列,類似于 SQL 中的?CASE WHEN?語句,下面就來介紹一下,感興趣的可以了解一下
    2025-05-05
  • Python實(shí)現(xiàn)購物車程序

    Python實(shí)現(xiàn)購物車程序

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)購物車程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • Python基于pillow判斷圖片完整性的方法

    Python基于pillow判斷圖片完整性的方法

    這篇文章主要介紹了Python基于pillow判斷圖片完整性的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了pillow的安裝及圖片完整性判斷的相關(guān)操作技巧,需要的朋友可以參考下
    2016-09-09
  • python中__slots__用法實(shí)例

    python中__slots__用法實(shí)例

    這篇文章主要介紹了python中__slots__用法,實(shí)例分析了__slots__的功能與相關(guān)使用技巧,需要的朋友可以參考下
    2015-06-06
  • Gradio機(jī)器學(xué)習(xí)模型快速部署工具接口狀態(tài)

    Gradio機(jī)器學(xué)習(xí)模型快速部署工具接口狀態(tài)

    這篇文章主要為大家介紹了Gradio機(jī)器學(xué)習(xí)模型快速部署工具接口狀態(tài)的原文翻譯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 基于Python開發(fā)一個(gè)小說圖片PDF生成器

    基于Python開發(fā)一個(gè)小說圖片PDF生成器

    本項(xiàng)目是一個(gè)基于 wxPython 開發(fā)的桌面應(yīng)用程序,用于將圖片和文字描述組合生成精美的 PDF 小說,它解決了創(chuàng)作者需要將圖文內(nèi)容快速整理成電子書的需求,特別適合繪本、圖文小說、攝影作品集等場(chǎng)景,需要的朋友可以參考下
    2025-10-10
  • 基于tkinter中ttk控件的width-height設(shè)置方式

    基于tkinter中ttk控件的width-height設(shè)置方式

    這篇文章主要介紹了基于tkinter中ttk控件的width-height設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python中的閉包裝飾器和深淺拷貝案例演示

    Python中的閉包裝飾器和深淺拷貝案例演示

    本文給大家介紹Python中的閉包裝飾器和深淺拷貝,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-09-09
  • playwright日期控件的具體使用

    playwright日期控件的具體使用

    本文主要介紹了playwright日期控件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • python讀取圖片并修改格式與大小的方法

    python讀取圖片并修改格式與大小的方法

    這篇文章主要為大家詳細(xì)介紹了python讀取圖片并修改格式與大小的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評(píng)論

东丰县| 木里| 武隆县| 集安市| 临夏县| 奉化市| 东乡| 化德县| 邛崃市| 报价| 土默特右旗| 县级市| 安溪县| 同心县| 武邑县| 读书| 宣武区| 噶尔县| 瑞丽市| 武宁县| 体育| 富裕县| 玉屏| 岗巴县| 卓尼县| 青海省| 册亨县| 弋阳县| 郁南县| 泰宁县| 长兴县| 民权县| 东辽县| 台湾省| 神农架林区| 镇巴县| 贡嘎县| 青阳县| 精河县| 丽江市| 古交市|