利用 Python Faker 包來制作假數據

      網友投稿 990 2022-05-29

      在做程序開發的時候,我們經常會用到一些測試數據,相信大多數同學是這么來造測試數據的:

      test1 test01 test02 測試1 測試2 測試數據1 這是一段測試文本 這是一段很長很長很長的測試文本...

      這是一段測試文本

      這是一段很長很長很長的測試文本...

      中槍的請舉手。

      不僅要自己手動敲這些測試數據,還敲的這么假。那有啥辦法呢?難不成有什么東西能自動給我造點以假亂真的數據???你別說,還真有!

      在 Python 中有個神庫,叫做 Faker,它可以自動幫我們來生成各種各樣的看起來很真的”假“數據,讓我們來看看吧!

      安裝

      首先讓我們來看看這個庫的安裝方法,實際上裝起來非常簡單,使用 pip 安裝即可,Python3 版本的安裝命令如下:

      pip3?install?faker

      安裝好了之后,我們使用最簡單的例子來生成幾個假數據試試:

      from?faker?import?Faker ? faker?=?Faker() print('name:',?faker.name()) print('address:',?faker.address()) print('text:',?faker.text())

      首先我們從 faker 這個包里面導入一個 Faker 類,然后將其實例化為 faker 對象,依次調用它的 name、address、text 方法,看下運行效果:

      name:?Nicholas?Wilson address:?70561?Simmons?Road?Apt.?893 Lake?Raymondville,?HI?35240 text:?Both?begin?bring?federal?space. Official?start?idea?specific.?Able?under?young?fire. Who?show?line?traditional?easy?people.?Until?economic?lead?event?case.?Technology?college?his?director?style.

      看到這里給我們生成了看起來很真的英文姓名、地址、長文本。

      但我們是中國人,我們肯定想要生成中文的吧,不用擔心,這個庫對非常多的語言都有支持,當然也包括中文了,具體的支持的語言列表可以見:https://faker.readthedocs.io/en/master/locales.html。

      這里幾個比較常見的語言代號列一下:

      簡體中文:zh_CN

      繁體中文:zh_TW

      美國英文:en_US

      英國英文:en_GB

      德文:de_DE

      日文:ja_JP

      韓文:ko_KR

      法文:fr_FR

      那么如果要生成中文,只需要在 Faker 類的第一個參數傳入對應的語言代號即可,例如簡體中文就傳入 zh_CN,所以上面的代碼改寫如下:

      from?faker?import?Faker ? faker?=?Faker('zh_CN') print('name:',?faker.name()) print('address:',?faker.address()) print('text:',?faker.text())

      運行結果如下:

      name:?何琳 address:?寧夏回族自治區六盤水縣南溪北鎮街f座?912311 text:?經營軟件積分開始次數專業.美國留言一種管理人民解決兩個.支持只有地方一切. 文化目前東西的是不過所以.系統覺得這種為什一下他們.時候以及這樣繼續是一狀態威望. 網站密碼情況.問題一點那個還是.其實過程詳細. 中國歷史環境電話規定.經驗上??刂撇灰?朋友運行項目我們. 以后今天那些使用免費國家加入但是.內容簡介空間次數最大一個.日期通過得到日本北京.

      可以看到一段中文的姓名、地址、長文本便生成了??雌饋淼刂肥鞘》荨⒌丶壥?、縣級市、街道是隨機組合的,文本也是一些隨機的詞組合而成的,但其實這樣已經比文章一開頭列的測試數據強太多了。

      上面的代碼每次運行得到的結果都是不同的,因為生成的結果都是隨機組合而成的。

      Provider

      接下來讓我們詳細看下 faker 可以都生成什么類型的數據,具體的可用 API 可以看 https://faker.readthedocs.io/en/master/locales/zh_CN.html,這里面列出來了可用的所有方法。

      但打開之后可以發現,這里面多了一個 Provider 對象,那么這個 Provider 是怎么一回事呢?

      實際上這個 faker 庫在設計上,為了解耦,將 Provider 對象做成了 Faker 對象的”插件“。Faker 可以添加一個個 Provider 對象,Provider 對象為 Faker 對象提供了生成某項數據的核心實現。就相當于 Faker 對象是一個生成器,它的生成功能依賴于什么呢?依賴于 Provider,是 Provider 提供給了 Faker 對象生成某項數據的能力。

      正是因為 Faker 對象內置了一些 Provider 對象,Faker 對象才可以生成剛才所要求的姓名、地址和文本。

      那么這時候我們肯定就很好奇了,既然 Faker 對象有生成數據的能力,那么它一定內置了一些默認的 Provider 對象,下面我們來打印看一下:

      from?faker?import?Faker ? faker?=?Faker('zh_CN') print(faker.providers)

      運行結果如下:

      [,?,? ,?, ?,?, ??,?,? ??,?,? ??,?, ???,?, ????,?, ?????,?, ??????,?,? ??????,?]

      還真不少,通過名字可以看到有 user_agent、phone_number、isbn、credit_card 等 Provider,其中具有語言差異化的 Provider 還單獨區分了語言,比如 phone_number 代表電話號碼,這個不同語言的不同,所以這里就又分了一層 zh_CN,作了語言的區分。

      利用 Python Faker 包來制作假數據

      這樣一來,通用的 Provider 就直接處在某個 Provider 類別的模塊中,具有語言差異的 Provider 就又根據不同的語言進一步劃分了模塊,設計上非常科學,易擴展又不冗余。

      知道了 Faker 具有這么多 Provider 之后,我們來看看剛才調用的 name、address 等方法又和 Provider 有什么關系呢?

      我們將 name、address、text 等方法打印一下看看:

      from?faker?import?Faker ? faker?=?Faker('zh_CN') print('name:',?faker.name) print('address:',?faker.address) print('text:',?faker.text)

      注意這里沒有調用,而是直接打印了這三個方法,這樣可以直接輸出方法的對象形式的描述,結果如下:

      name:?> address:?> text:?>

      恍然大悟,原來我們調用的方法就是 Faker 對象調用的 Provider 里面的對應方法,比如 name 就是 faker.providers.person.zhCN.Provider 里面的 name 方法,二者是一致的,我們扒一扒源碼驗證下,源碼在:[https://github.com/joke2k/faker/blob/master/faker/providers/person/__init_.py](https://github.com/joke2k/faker/blob/master/faker/providers/person/__init__.py),果不其然,里面定義了 name 方法,然后 Faker 動態地將這個方法引入進來了,就可以使用了。

      方法列舉

      既然有這么多 Provider,下面我們再詳細地看看還有哪些常用的方法吧,下面進行一部分簡單的梳理,參考來源文檔地址為:https://faker.readthedocs.io/en/master/providers.html。

      Address

      Address,用于生成一些和地址相關的數據,如地址、城市、郵政編碼、街道等內容, 用法如下:

      faker.address() #?'新疆維吾爾自治區杰縣南湖武漢街D座?253105' faker.building_number() #?'B座' faker.city() #?'璐縣' faker.city_name() #?'貴陽' faker.city_suffix() #?'縣' faker.country() #?'阿拉斯加' faker.country_code(representation="alpha-2") #?'CR' faker.district() #?'西峰' faker.postcode() #?'726749' faker.province() #?'福建省' faker.street_address() #?'余路N座' faker.street_name() #?'李路' faker.street_suffix() #?'路'

      Color

      Color,用于生成和顏色相關的數據,如 HEX、RGB、RGBA 等格式的顏色,用法如下:

      faker.color_name() #?'DarkKhaki' faker.hex_color() #?'#97d14e' faker.rgb_color() #?'107,179,51' faker.rgb_css_color() #?'rgb(20,46,70)' faker.safe_color_name() #?'navy' faker.safe_hex_color() #?'#dd2200'

      Company

      Company,用于生成公司相關數據,如公司名、公司前綴、公司后綴等內容,用法如下:

      faker.bs() #?'grow?rich?initiatives' faker.catch_phrase() #?'Self-enabling?encompassing?function' faker.company() #?'恒聰百匯網絡有限公司' faker.company_prefix() #?'暉來計算機' faker.company_suffix() #?'信息有限公司'

      Credit Card

      Credit Card,用于生成信用卡相關數據,如過期時間、銀行卡號、安全碼等內容,用法如下:

      faker.credit_card_expire(start="now",?end="+10y",?date_format="%m/%y") #?'08/20' faker.credit_card_full(card_type=None) #?'Mastercardn玉蘭?范n5183689713096897?01/25nCVV:?012n' faker.credit_card_number(card_type=None) #?'4009911097184929918' faker.credit_card_provider(card_type=None) #?'JCB?15?digit' faker.credit_card_security_code(card_type=None) #?'259'

      Date Time

      Date Time,用于生成時間相關數據,如年份、月份、星期、出生日期等內容,可以返回 datetime 類型的數據,用法如下:

      faker.am_pm() #?'AM' faker.century() #?'X' faker.date(pattern="%Y-%m-%d",?end_datetime=None) #?'1997-06-16' faker.date_between(start_date="-30y",?end_date="today") #?datetime.date(2000,?8,?30) faker.date_between_dates(date_start=None,?date_end=None) #?datetime.date(2019,?7,?30) faker.date_object(end_datetime=None) #?datetime.date(1978,?3,?12) faker.date_of_birth(tzinfo=None,?minimum_age=0,?maximum_age=115) #?datetime.date(2012,?6,?3) faker.date_this_century(before_today=True,?after_today=False) #?datetime.date(2011,?6,?12) faker.date_this_decade(before_today=True,?after_today=False) #?datetime.date(2011,?8,?22) faker.date_this_month(before_today=True,?after_today=False) #?datetime.date(2019,?7,?25) faker.date_this_year(before_today=True,?after_today=False) #?datetime.date(2019,?7,?22) faker.date_time(tzinfo=None,?end_datetime=None) #?datetime.datetime(2018,?8,?11,?22,?3,?34) faker.date_time_ad(tzinfo=None,?end_datetime=None,?start_datetime=None) #?datetime.datetime(1566,?8,?26,?16,?25,?30) faker.date_time_between(start_date="-30y",?end_date="now",?tzinfo=None) #?datetime.datetime(2015,?1,?31,?4,?14,?10) faker.date_time_between_dates(datetime_start=None,?datetime_end=None,?tzinfo=None) #?datetime.datetime(2019,?7,?30,?17,?51,?44) faker.date_time_this_century(before_now=True,?after_now=False,?tzinfo=None) #?datetime.datetime(2002,?9,?25,?23,?59,?49) faker.date_time_this_decade(before_now=True,?after_now=False,?tzinfo=None) #?datetime.datetime(2010,?5,?25,?20,?20,?52) faker.date_time_this_month(before_now=True,?after_now=False,?tzinfo=None) #?datetime.datetime(2019,?7,?19,?18,?4,?6) faker.date_time_this_year(before_now=True,?after_now=False,?tzinfo=None) #?datetime.datetime(2019,?3,?15,?11,?4,?18) faker.day_of_month() #?'04' faker.day_of_week() #?'Monday' faker.future_date(end_date="+30d",?tzinfo=None) #?datetime.date(2019,?8,?12) faker.future_datetime(end_date="+30d",?tzinfo=None) #?datetime.datetime(2019,?8,?24,?2,?59,?4) faker.iso8601(tzinfo=None,?end_datetime=None) #?'1987-07-01T18:33:56' faker.month() #?'11' faker.month_name() #?'August' faker.past_date(start_date="-30d",?tzinfo=None) #?datetime.date(2019,?7,?25) faker.past_datetime(start_date="-30d",?tzinfo=None) #?datetime.datetime(2019,?7,?18,?22,?46,?51) faker.time(pattern="%H:%M:%S",?end_datetime=None) #?'16:22:30' faker.time_delta(end_datetime=None) #?datetime.timedelta(0) faker.time_object(end_datetime=None) #?datetime.time(22,?12,?15) faker.time_series(start_date="-30d",?end_date="now",?precision=None,?distrib=None,?tzinfo=None) #? faker.timezone() #?'Indian/Comoro' faker.unix_time(end_datetime=None,?start_datetime=None) #?1182857626 faker.year() #?'1970'

      File

      File,用于生成文件和文件路徑相關的數據,包括文件擴展名、文件路徑、MIME_TYPE、磁盤分區等內容,用法如下:

      faker.file_extension(category=None) #?'flac' faker.file_name(category=None,?extension=None) #?'然后.numbers' faker.file_path(depth=1,?category=None,?extension=None) #?'/關系/科技.mov' faker.mime_type(category=None) #?'video/ogg' faker.unix_device(prefix=None) #?'/dev/sdd' faker.unix_partition(prefix=None) #?'/dev/xvds3'

      Geo

      Geo,用于生成和地理位置相關的數據,包括經緯度,時區等等信息,用法如下:

      faker.coordinate(center=None,?radius=0.001) #?Decimal('-114.420686') faker.latitude() #?Decimal('-9.772541') faker.latlng() #?(Decimal('-27.0730915'),?Decimal('-5.919460')) faker.local_latlng(country_code="US",?coords_only=False) #?('41.47892',?'-87.45476',?'Schererville',?'US',?'America/Chicago') faker.location_on_land(coords_only=False) #?('12.74482',?'4.52514',?'Argungu',?'NG',?'Africa/Lagos') faker.longitude() #?Decimal('40.885895')

      Internet

      Internet,用于生成和互聯網相關的數據,包括隨機電子郵箱、域名、IP 地址、URL、用戶名、后綴名等內容,用法如下:

      faker.ascii_company_email(*args,?**kwargs) #?'xuna@xiaqian.cn' faker.ascii_email(*args,?**kwargs) #?'min59@60.cn' faker.ascii_free_email(*args,?**kwargs) #?'min75@gmail.com' faker.ascii_safe_email(*args,?**kwargs) #?'cliu@example.com' faker.company_email(*args,?**kwargs) #?'ilong@99.cn' faker.domain_name(levels=1) #?'xiulan.cn' faker.domain_word(*args,?**kwargs) #?'luo' faker.email(*args,?**kwargs) #?'maoxiulan@hotmail.com' faker.free_email(*args,?**kwargs) #?'yanshen@gmail.com' faker.free_email_domain(*args,?**kwargs) #?'yahoo.com' faker.hostname(*args,?**kwargs) #?'lt-18.pan.cn' faker.image_url(width=None,?height=None) #?'https://placekitten.com/51/201' faker.ipv4(network=False,?address_class=None,?private=None) #?'192.233.68.5' faker.ipv4_network_class() #?'a' faker.ipv4_private(network=False,?address_class=None) #?'10.9.97.93' faker.ipv4_public(network=False,?address_class=None) #?'192.51.22.7' faker.ipv6(network=False) #?'de57:9c6f:a38c:9864:10ec:6442:775d:5f02' faker.mac_address() #?'99:80:5c:ab:8c:a9' faker.safe_email(*args,?**kwargs) #?'tangjuan@example.net' faker.slug(*args,?**kwargs) #?'' faker.tld() #?'cn' faker.uri() #?'http://fangfan.org/app/tag/post/' faker.uri_extension() #?'.php' faker.uri_page() #?'about' faker.uri_path(deep=None) #?'app' faker.url(schemes=None) #?'http://mingli.cn/' faker.user_name(*args,?**kwargs) #?'jie54'

      Job

      Job,用于生成和職業相關的數據,用法如下:

      faker.job() #?'燙工'

      Lorem

      Lorem,用于生成一些假文字數據,包括句子、自然段、長文本、關鍵詞等,另外可以傳入不同的參數來控制生成的長度,用法如下:

      在這里每個方法的參數是不同的,具體的參數解釋可以見源代碼每個方法的注釋:https://github.com/joke2k/faker/blob/master/faker/providers/lorem/__init__.py,

      Misc

      Misc,用于生成生成一些混淆數據,比如密碼、sha1、sha256、md5 等加密后的內容,用法如下:

      faker.boolean(chance_of_getting_true=50) #?True faker.md5(raw_output=False) #?'3166fa26ffd3f2a33e020dfe11191ac6' faker.null_boolean() #?False faker.password(length=10,?special_chars=True,?digits=True,?upper_case=True,?lower_case=True) #?'W7Ln8La@%O' faker.sha1(raw_output=False) #?'c8301a2a79445439ee5287f38053e4b3a05eac79' faker.sha256(raw_output=False) #?'1e909d331e20cf241aaa2da894deae5a3a75e5cdc35c053422d9b8e7ccfa0402' faker.uuid4(cast_to=) #?'6e6fe387-6877-48d9-94ea-4263c4c71aa5'

      Person

      Person,用于生成和人名相關的數據,包括姓氏、名字、全名、英文名等內容,還能區分男女名字,用法如下:

      faker.first_name() #?'穎' faker.first_name_female() #?'芳' faker.first_name_male() #?'利' faker.first_romanized_name() #?'Jing' faker.last_name() #?'溫' faker.last_name_female() #?'寇' faker.last_name_male() #?'陳' faker.last_romanized_name() #?'Lei' faker.name() #?'黃明' faker.name_female() #?'張凱' faker.name_male() #?'黃鵬'

      User-Agent

      User-Agent,用于生成和瀏覽器 User-Agent 相關的內容,可以定制各種瀏覽器,還可以傳入版本信息來控制生成的內容,用法如下:

      faker.chrome(version_from=13,?version_to=63,?build_from=800,?build_to=899) #?('Mozilla/5.0?(X11;?Linux?x86_64)?AppleWebKit/5332?(KHTML,?like?Gecko)?' #??'Chrome/40.0.837.0?Safari/5332') faker.firefox() #?('Mozilla/5.0?(Macintosh;?U;?Intel?Mac?OS?X?10_8_9;?rv:1.9.4.20)?' #??'Gecko/2019-05-02?05:58:44?Firefox/3.6.19') faker.internet_explorer() #?'Mozilla/5.0?(compatible;?MSIE?8.0;?Windows?NT?5.2;?Trident/3.0)' faker.linux_platform_token() #?'X11;?Linux?i686' faker.linux_processor() #?'x86_64' faker.mac_platform_token() #?'Macintosh;?U;?PPC?Mac?OS?X?10_12_5' faker.mac_processor() #?'U;?Intel' faker.opera() #?'Opera/9.77.(Windows?NT?4.0;?vi-VN)?Presto/2.9.182?Version/11.00' faker.safari() #?('Mozilla/5.0?(Macintosh;?PPC?Mac?OS?X?10_7_1?rv:5.0;?or-IN)?' #??'AppleWebKit/535.9.4?(KHTML,?like?Gecko)?Version/5.0.2?Safari/535.9.4') faker.user_agent() #?'Opera/8.69.(X11;?Linux?i686;?ml-IN)?Presto/2.9.170?Version/11.00' faker.windows_platform_token() #?'Windows?NT?6.1'

      以上僅僅列了一部分,還有更多的功能大家可以查看官方文檔的內容,鏈接為:https://faker.readthedocs.io/en/master/locales/zh_CN.html。

      其他 Provider

      另外還有一些社區貢獻的 Provider,如 WiFi、微服務相關的,大家可以查看文檔的說明,另外需要額外安裝這些擴展包并自行添加 Provider,文檔見:https://faker.readthedocs.io/en/master/communityproviders.html。

      添加 Provider 需要調用 add_provider 方法,用法示例如下:

      from?faker?import?Faker from?faker.providers?import?internet ? faker?=?Faker() faker.add_provider(internet) print(faker.ipv4_private())

      還有更多的內容大家可以參考官方文檔,鏈接:https://faker.readthedocs.io/。

      ---------------------

      本文轉自靜覓

      python

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:分布式系統關注點(19)——深入淺出「異步」
      下一篇:青出于藍而勝于藍——揭秘全新的 HWSQL
      相關文章
      亚洲成人动漫在线| 亚洲va久久久噜噜噜久久狠狠| 亚洲激情中文字幕| 国产成A人亚洲精V品无码| 国产亚洲情侣一区二区无码AV| 亚洲精品国产综合久久一线| 99亚洲乱人伦aⅴ精品| 亚洲国产成人久久精品大牛影视 | 亚洲三级视频在线观看 | 国产成人不卡亚洲精品91| 亚洲AⅤ男人的天堂在线观看| 亚洲经典千人经典日产| 亚洲AV无码国产剧情| 亚洲变态另类一区二区三区| 亚洲中文字幕无码中文| 亚洲一区二区三区成人网站| 亚洲日韩国产二区无码| 亚洲第一第二第三第四第五第六| 亚洲AV无码专区在线观看成人| 国产亚洲一卡2卡3卡4卡新区| 国产精品亚洲综合网站| 亚洲精品国产精品乱码不卡 | 亚洲毛片基地日韩毛片基地| 亚洲人成电影在线观看网| 亚洲国产成人99精品激情在线| 国产成人亚洲精品| 亚洲精品无码日韩国产不卡av| 青草久久精品亚洲综合专区| 成人亚洲综合天堂| 在线亚洲精品自拍| 久久久久久亚洲精品中文字幕| 亚洲资源在线观看| 亚洲av乱码一区二区三区香蕉| 亚洲午夜无码久久久久小说| 狼人大香伊蕉国产WWW亚洲| 国产日产亚洲系列最新| 国产亚洲无线码一区二区| 亚洲欧洲在线观看| 久久精品国产亚洲AV蜜臀色欲| 亚洲成av人在线观看网站| 国产成人亚洲综合|