簡體   English   中英

Python-文件解析

[英]Python- File Parsing

編寫一個程序,讀取一個名為input.txt的文本文件,該文件包含任意數量的“,”形式的行,然后使用字典記錄此信息,最后將文件中所代表的國家/地區列表和編號輸出到屏幕所包含的城市。

例如,如果input.txt包含以下內容:

New York, US
Angers, France
Los Angeles, US
Pau, France
Dunkerque, France
Mecca, Saudi Arabia

該程序將輸出以下內容(按某種順序):

Saudi Arabia : 1
US : 2
France : 3

我的代碼:

from os import dirname

def parseFile(filename, envin, envout = {}):
    exec "from sys import path" in envin
    exec "path.append(\"" + dirname(filename) + "\")" in envin
    envin.pop("path")
    lines = open(filename, 'r').read()
    exec lines in envin
    returndict = {}
    for key in envout:
        returndict[key] = envin[key]
    return returndict

我收到語法錯誤:語法無效...當我使用文件名時,我使用文件名input.txt

我不明白您要做什么,所以我無法真正解釋如何解決。 特別是為什么要exec文件的行? 為什么還要寫exec "foo"而不是foo 我認為您應該回到基本的Python教程...

無論如何,您需要做的是:

  • 使用完整路徑open文件
  • for line in file:中的行for line in file:處理該行並將其存儲在字典中
  • 返回字典

就是這樣,不涉及exec

是的,這是您不需要或不應該做的很多廢話。 這是我在Python 2.7之前的方法(在此之后,使用collections.Counter,如其他答案所示)。 請注意,這將返回包含計數的字典,而不是將其打印出來,您必須從外部進行操作。 我也不想為作業提供一個完整的解決方案,但是它已經完成了,所以我認為在解釋它方面並沒有真正的損害。

def parseFile(filename):
  with open(filename, 'r') as fh:
    lines = fh.readlines()
    d={}
    for country in [line.split(',')[1].strip() for line in lines]:
      d[country] = d.get(country,0) + 1
    return d

讓我們分解一下,好嗎?

  with open(filename, 'r') as fh:
    lines = fh.readlines()

通常,這就是打開文本文件進行閱讀的方式。 如果該文件不存在或您沒有權限等,它將引發IOError異常,因此,您需要捕獲該異常。 readlines()讀取整個文件並將其拆分為幾行,每一行成為列表中的一個元素。

    d={}

這只是初始化一個空字典

    for country in [line.split(',')[1].strip() for line in lines]:

這就是樂趣的開始。 右邊的方括號稱為列表理解,它基本上為您生成一個列表。 用通俗的英語來說,它的意思是“針對列表“行”中的每個元素“行”,采用該元素/行,在每個逗號中進行分割,采用列表中的第二個元素(索引1)從拆分中刪除所有空白,然后將結果用作新列表中的元素”,然后,其左側部分僅在生成的列表上進行迭代,為作用域中的當前元素命名為“國家”循環體的

      d[country] = d.get(country,0) + 1

好吧,請仔細考慮一下,如果我們使用以下內容而不是上面的行會發生什么:

      d[country] = d[country] + 1

它將崩潰,正確(KeyError異常),因為d [country]第一次沒有值。 因此,我們使用get()方法,所有字典都有它。 這是一個很漂亮的部分-get()帶有一個可選的第二個參數,如果要查找的元素不存在,這就是我們想從中獲取的內容。 因此,它不會崩潰,而是返回0,我們可以向其中添加1(與None不同),並使用新的計數更新字典。 然后,我們只退還很多。

希望能幫助到你。

import collections

def readFile(fname):
    with open(fname) as inf:
        return [tuple(s.strip() for s in line.split(",")) for line in inf]

def countCountries(city_list):
    return collections.Counter(country for city,country in city_list)

def main():
    cities = readFile("input.txt")
    countries = countCountries(cities)

    print("{0} cities found in {1} countries:".format(len(cities), len(countries)))

    for country, num in countries.iteritems():
        print("{country}: {num}".format(country=country, num=num))

if __name__=="__main__":
    main()

我將使用defaultdict加一個列表來維護信息的結構。 因此,可以得出其他統計信息。

import collections

def parse_cities(filepath):
    countries_cities_map = collections.defaultdict(list)
    with open(filepath) as fd:
        for line in fd:
            values = line.strip().split(',')
            if len(values) == 2:
                city, country = values
                countries_cities_map[country].append(city)
    return countries_cities_map

def format_cities_per_country(countries_cities_map):
    for country, cities in countries_cities_map.iteritems():
        print " {ncities} Cities found in {country} country".format(country=country, ncities = len(cities))


if __name__ == '__main__':
    import sys
    filepath = sys.argv[1]
    format_cities_per_country(parse_cities(filepath))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM