.txt文件在Python 3.3.3中无法正确读取和写入

时间:2014-01-05 15:59:58

标签: python file text python-3.x

无论如何,我一直在尝试读取和写入Python 3.3.3中的文本文件,但它一直没有用。我的代码如下:

import math
pFile=open('/Users/Username/Desktop/Programming:Design/Program Access Files/primes.txt')
pList=[]
for line in pFile:
    pList=pList+(int(line.strip()))
def testPrime(num,pList):
    if num<=1:
        return False
    testList=[]
    place=0
    sqrt=math.sqrt(num)-((math.sqrt(num))%1)
    p=pList[place]
    while p<=sqrt:
        testList.append(p)
        place=place+1
        p=pList[place]
    for i in testList:
        if i%num==0:
            return False
    return True
print('Hello and Welcome to the Prime Finder 000!')
end=int(input('What integer would you like me to go to today?'))
for j in range(pList[-1],end+1):
    if testPrime(j,pList)==True:
        pList.append(j)
        print(j)
pFile.close()
pFile=open('/Users/Username/Desktop/Programming:Design/Program Access Files/primes.txt','w')
for k in pList:
    pFile.write(str(k))
    pFile.write('\r\n')
pFile.close()

该程序应该搜索所有正整数以查找素数。我试图存储的文本文件是'primes.txt',在我尝试打开它时显示的目录中。但是,我的阅读文件的方法肯定是错的,即:

pFile=open('/Users/Username/Desktop/Programming:Design/Program Access Files/primes.txt')
    pList=[]
    for line in pFile:
        pList=pList+(int(line.strip()))

我确信我的查找素数的功能有效,但它们没有正确存储。目前,该程序所做的是擦除文本文件'primes.txt'并打印出每个数字从2到用户输入的数字作为素数,按照我还没有找到的顺序。

2 个答案:

答案 0 :(得分:1)

Ya,正如@ maurelio79和@DSM所说,看起来你正在读取和写入同一个文件,你要添加一个int到列表......这应该是不可能的。此外,使用with打开文件更简洁:

pList = []
with open(fle_path, 'r') as fle:
   for line in fle:
      pList.append(int(line.rstrip("\n")))


#find and append new primes to pList using pList.append(<new prime>)


with open(fle_path, 'a') as fle: 
   for item in pList:
      fle.write(str(item)+"\n")

使用'r'读取文件,'w'每次使用空白文件启动a,使用'a'附加到现有文件。您可以使用相同的文件,但使用'a'参数附加新找到的素数。

使用with语句会在循环存在时自动关闭文件。

答案 1 :(得分:0)

我(大致)重写了你的例子,向你展示什么是更好的习语。

首先,你的主要发现者可能很棒,因为我使用了一个基于测试的单个数字:

def isprime(n):
    '''check if integer n is a prime'''
    # make sure n is a positive integer
    n = abs(int(n))
    # 0 and 1 are not primes
    if n < 2:
        return False
    # 2 is the only even prime number
    if n == 2: 
        return True    
    # all other even numbers are not primes
    if not n & 1: 
        return False
    # range starts with 3 and only needs to go up the squareroot of n
    # for all odd numbers
    for x in range(3, int(n**0.5)+1, 2):
        if n % x == 0:
            return False
    return True

接下来,我不知道你的源文件中有什么。在这里,我向您提出了“多远”的相同问题,然后展示了阅读和编写该文件的更好方法:

print('Hello and Welcome to the Prime Finder 000!')
end=int(input('What integer would you like me to go to today?'))

with open('/tmp/nums.txt', 'w') as fout:
    for n in range(1,end+1):
        fout.write('{}\n'.format(n))

最后,读取整数2-end中的文件并依次测试每个文件的素数。将素数写入新文件prime.txt

with open('/tmp/nums.txt') as f, open('/tmp/primes.txt', 'w') as fout:
    for n in f:
        n=int(n)
        if isprime(n):
            print(n)
            fout.write('{}\n'.format(n))

如果您希望拥有素数列表,请按以下方式添加到列表中:

primes=[]        
with open('/tmp/nums.txt') as f:
    for n in f:
        n=int(n)
        if isprime(n):
            print(n)
            primes.append(n)

有几点需要注意:

  1. 使用with关键字打开文件。您的文件将在结尾处自动关闭。
  2. 该文件用作迭代器,因为在这种情况下没有理由将整个文件读入内存
  3. 没有必要为每一行带回车符int(line.strip())int首先删除空格,以便int('12\r\n')正常工作
  4. pList+(int(line.strip()))可能是TypeError,因为您无法将int连接到列表。请改用pList.append(int(line))