簡體   English   中英

為什么我的代碼僅在第二次運行時才記錄到文件中?

[英]Why my code is recording into the file only when I run it second time?

我的目標是計算單詞數。 當我運行代碼時,我想:

  1. 從文件中讀取字符串
  2. 用文字將每一行分開
  3. 將這些單詞添加到字典中
  4. 排序鍵並將其添加到列表
  5. 將包含鍵和適當值的字符串寫入文件

當我第一次運行的代碼寫在文件中任何東西,但我看到我的屏幕上的結果。 該文件為空。 僅當我第二次運行代碼時,我看到內容被記錄到文件中。

為什么會這樣呢?

#read in the file
fileToRead = open('../folder/strings.txt')
fileToWrite = open('../folder/count.txt', 'w')

d = {}
#iterate over every line in the file
for line in fileToRead:
    listOfWords = line.split()
    #iterate over every word in the list
    for word in listOfWords:
        if word not in d:
            d[word] = 1
        else:
            d[word] = d.get(word) + 1
#sort the keys
listF = sorted(d)

#iterate over sorted keys and write them in the file with appropriate value
for word in listF:
    string = "{:<18}\t\t\t{}\n".format(word, d.get(word))
    print string
    fileToWrite.write(string)

進行了幾次更改,它認為您的意思是每次打開時都將“ a”(附加到文件)而不是“ w”覆蓋文件(“ count.txt”,“ a”)。 也請嘗試使用with語句讀取和寫入文件,因為在完成讀/寫操作后,它將自動關閉文件描述符。

#read in the file
fileToRead = open('strings.txt')

d = {}
#iterate over every line in the file
for line in fileToRead:
    listOfWords = line.split()
    #iterate over every word in the list
    for word in listOfWords:
        if word not in d:
            d[word] = 1
        else:
            d[word] = d.get(word) + 1
#sort the keys
listF = sorted(d)

#iterate over sorted keys and write them in the file with appropriate value
with open('count.txt', 'a') as fileToWrite:
    for word in listF:
        string = "{:<18}\t\t\t{}\n".format(word, d.get(word))
        print string,
        fileToWrite.write(string)

當您執行file.write(some_data) ,它將數據寫入緩沖區,但寫入文件。 僅在執行file.close()時將文件保存到磁盤。

f = open('some_temp_file.txt', 'w')

f.write("booga boo!")
# nothing written yet to disk

f.close()
# flushes the buffer and writes to disk

更好的方法是將路徑存儲在變量中,而不是文件對象中。 然后,您可以根據需要打開文件(然后再次關閉)。

read_path = '../folder/strings.txt'
write_path = '../folder/count.txt'

這也使您可以使用with關鍵字,該關鍵字可以更優雅地處理文件的打開和關閉。

read_path = '../folder/strings.txt'
write_path = '../folder/count.txt'

d = dict()

with open(read_path) as inf:
    for line in inf:
        for word in line.split()
            d[word] = d.get(word, 0) + 1
            # remember dict.get's default value! Saves a conditional

# since we've left the block, `inf` is closed by here

sorted_words = sorted(d)

with open(write_path, 'w') as outf:
    for word in sorted_words:
        s = "{:<18}\t\t\t{}\n".format(word, d.get(word))
        # don't shadow the stdlib `string` module
        # also: why are you using both fixed width AND tab-delimiters in the same line?
        print(s)  # not sure why you're doing this, but okay...
        outf.write(s)
# since we leave the block, the file closes automagically.

就是說,您可以做一些事情來使總體情況更好一些。 首先:計算容器中有多少東西是collections.Counter的工作。

In [1]: from collections import Counter

In [2]: Counter('abc')
Out[2]: Counter({'a': 1, 'b': 1, 'c': 1})

Counter可以與預期行為一起添加

In [3]: Counter('abc') + Counter('cde')
Out[3]: Counter({'c': 2, 'a': 1, 'b': 1, 'd': 1, 'e': 1})

並以與鍵排序字典相同的方式進行排序

In [4]: sorted((Counter('abc') + Counter('cde')).items(), key=lambda kv: kv[0])
Out[4]: [('a', 1), ('b', 1), ('c', 2), ('d', 1), ('e', 1)]

將所有這些放在一起,您可以執行以下操作:

from collections import Counter

read_path = '../folder/strings.txt'
write_path = '../folder/count.txt'

with open(read_path) as inf:
    results = sum([Counter(line.split()) for line in inf])

with open(write_path, 'w') as outf:
    for word, count in sorted(results.items(), key=lambda kv: kv[0]):
        s = "{:<18}\t\t\t{}\n".format(word, count)
        outf.write(s)

簡約版本:

import collections

with open('strings.txt') as f:
    d = collections.Counter(s for line in f for s in line.split())

with open('count.txt', 'a') as f:
    for word in sorted(d.iterkeys()):
        string = "{:<18}\t\t\t{}\n".format(word, d[word])
        print string,
        f.write(string)

暫無
暫無

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

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