错误:在python中文件i / o

时间:2012-07-04 13:05:55

标签: python django linux file ubuntu-10.04

我的views.py文件代码:

#!/usr/bin/python 

from django.template import loader, RequestContext
from django.http import HttpResponse
#from skey import find_root_tags, count, sorting_list
from search.models import Keywords
from django.shortcuts import render_to_response as rr

def front_page(request):

    if request.method == 'POST' :
        from skey import find_root_tags, count, sorting_list
        str1 = request.POST['word'] 
        fo = open("/home/pooja/Desktop/xml.txt","r")

        for i in range(count.__len__()):

            file = fo.readline()
            file = file.rstrip('\n')
            find_root_tags(file,str1,i) 

            list.append((file,count[i]))

        sorting_list(list)

        for name, count1 in list:
            s = Keywords(file_name=name,frequency_count=count1)
            s.save()

        fo.close()

        list1 = Keywords.objects.all()
        t = loader.get_template('search/results.html')
        c = RequestContext({'list1':list1,
        })

        return HttpResponse(t.render(c))

    else :  
        str1 = ''
        list = []
        template = loader.get_template('search/front_page.html')
        c = RequestContext(request)
        response = template.render(c)
        return HttpResponse(response)

我在函数find_root_tags(file,str1,i)中发送的变量“file”具有xml文件的名称。此文件存在于我的桌面上,此代码写在我的django应用程序的views.py文件中,因此无法打开该文件。如何打开该文件,因为xml.txt包含要读取然后打开的类似文件名。简而言之,我如何将文件参数发送为:

file1 = '/home/pooja/Desktop/<filename>'

此处<filename>等于存储在变量file中的值,并且可以将其称为:

find_root_tags(file1, str1, i)

/////////////////////////////////////////////// /////////////////////////////////////////////

澄清:

1)请参考变量“file”,您可以在其中看到我正在存储xml.txt的读取内容。

2)xml.txt包含xml文件名。 views.py文件是django app的一部分,由于它们存在于桌面上,因此无法打开这些文件。

3)我的问题是如何修改和发送包含文件名的文件变量,附加了它的绝对路径:

'/home/pooja/Desktop/filename'
通过这样做,它将打开桌面上的文件。

2 个答案:

答案 0 :(得分:1)

试试这个:

pathh='/home/pooja/Desktop/'      #set the base path       
fo = open("/home/pooja/Desktop/xml.txt")
for i in range(len(count)):     #use len(count)
    file = fo.readline()
    file = file.strip()          #use strip()
    find_root_tags(pathh+file,str1,i) #base path+file
    mylist.append((file,count[i]))   #using 'list' as a variable name is not good

答案 1 :(得分:0)

因此,如果我理解您的问题,文件/home/pooja/Desktop/xml.txt包含文件名,每行一个,相对于/home/pooja/Desktop/,您需要将完整路径名传递给find_root_tags

在Python中,您可以使用+来连接字符串,因此您可以执行以下操作:

files_path = "/home/pooja/Desktop/"

for i in range(len(count)):

    file = fo.readline()
    file = file.rstrip('\n')
    find_root_tags(files_path + file, str1, i) 

    list.append((file,count[i]))

旁白

首先,请注意我已将count.__len__替换为len(count)。在Python中,不直接调用魔术方法,即__xxxx__形式的方法。它们被定义为由其他一些机制调用。对于len方法,当您使用len()内置函数时,会在内部调用它。

其次,请注意,如果xml.txt中的行数少于len(count),则fo.readline会在您阅读完文件的所有行后引发异常。在Python中读取文件所有行的常用方法是:

my_file = open("/path/to/file", 'r')
for line in my_file:
    # do something with your line

最后,为确保您的文件在发生任何事情时都已关闭,即使您在阅读文件时引发异常,也可以使用with statement

所以在你的例子中,你会做类似的事情:

files_path = "/home/pooja/Desktop/"
with open("/path/to/file", 'r') as my_file:
    for file in my_file:
        file = file.rstrip('\n')
        find_root_tags(files_path + file, str1, i) 

        list.append((file,count[i]))