为什么没有这个readlines()&用于迭代工作?

时间:2016-04-08 17:48:43

标签: python text-files

readlines ()函数似乎无法正常工作,for迭代也不起作用。此外,当我尝试使用file.write ()写入文件时,它无法正常工作。有谁知道这是为什么?

crop = input("Which crop? ")
quantity = input("How many? ")

file = ('cropdatabase.txt', 'a+')

def appendA ():

 lines = file.readlines()
 print (lines)

 for line in lines:
    print ('1')

    if crop in line:

        print (crop)
        row = str(a)
        split_2 = a.split (',')
        split_2.append (quantity)

def appendB ():

 print ('3')
 file.write ('\n')
 file.write (crop + ' ')
 file.write (quantity + ' ')


with open('cropdatabase.txt', 'a+') as file:

if crop in open('cropdatabase.txt').read():
    appendA ()
else:
    appendB ()

file.close ()

This is what happens when I run it

2 个答案:

答案 0 :(得分:0)

您没有打开该文件。您需要使用open(filename, mode).readlines()

您正在使用上下文管理器并调用file变量。但是,您实际上并没有将file从上下文管理器传递给该函数。您也应该在file语句中将其命名为with ...以外的其他名称,因为该文件是内置的关键字。

答案 1 :(得分:0)

请勿使用名为file的变量。在python 2中,这(或多或少)与open相同。

其次,不要使用全局变量,作为参数传递。

第三,将所有不在函数内部的代码放在一起。

a+没有按你的想法行事。当您读取文件位置已经在文件结尾时,您将不会阅读任何内容。最简单的是两次读取文件。您可以使用seek()来操纵文件位置,但我怀疑它是否值得。

我应该补充说,附加到同一个数据文件是非常不寻常的。

appendA功能存在问题,我真的不知道你想在这里实现什么。

我意识到我可能有错误的流程,因为如果整个文件中没有裁剪,你只想附加B.为此,我们将使用字典来存储裁剪名称 - 这比每次读取整个文件要快得多。我不能把那些代码放进去因为a)我不确定那是你想要的,而b)我不知道输入文件的格式是什么。

让我们尝试解决这个问题:

def appendA(fo, crop, quantity, line):

    print('1')

    if crop in line:

        print(crop)
        #row = str(a)   <<<<  What is a?
        split_2 = line.split(',')
        split_2.append(quantity)

        # Now what ??

def appendB(fo, crop, quantity):

   print('3')
   fo.write('\n')
   fo.write(crop + ' ')
   fo.write(quantity + ' ')

crop = input("Which crop? ")
quantity = input("How many? ")

filename = 'cropdatabase.txt'
# First read the file
with open(filename) as fo:
    lines = fo.readlines()

# Now open for append
with open(filename, 'a') as fo:

     for line in lines:
         print(line)
         if crop in line:
             appendA(fo, crop, quantity, line)
         else:
             appendB(fo, crop, quantity)

说实话,我不确定我是否理解最终结果应该是什么,但试试这个,如果我做出了错误的假设,请告诉我。