2013-12-13 29 views
0

長時間潛伏者,第一次海報。 我尋找了一些解決方案,並沒有找到符合我需求的東西。Python 3.2:.txt到xml.txt

我的分配如下:例如輸入文件

student.txt

內容:

John Smith 
    Harvard 
    4.00 
    1600 

「你的任務是寫一個Python程序,稱爲批號(文件名),即以文件名作爲參數,它將打開文件並創建一個帶有標記數據的新文件,上面示例文件的輸出如下:「

<applicant> 
    <name> John Smith </name> 
    <school> Harvard </school> 
    <gpa> 4.00 </gpa> 
    <sat> 1600 </sat> 
    </applicant> 

另外:輸出文件的名稱與正在打開的文件的名稱相似。如果輸入的是student.txt,該出將studentXML.txt

我試圖用我的手切片(從另一個海報借用了這個):

tags = ['name', 'university', 'gpa', 'sat'] #Add desired 
tags xml = ''#Add xml parsing with open("data.txt") as data: 


#read data and filter out whitespace 
lines = [line.strip() for line in data.readlines()] 

#Generating xml tags via slicing 
xml = '\n'.join(['<{0:s}> {1:s} </{0:s)>'.format(tag, value) 
       for tag, value in zip(tags, lines)]) 

任何幫助將不勝感激。我很抱歉沒有編輯能力。

追溯,使用「data.txt」作爲文件。 (在同一文件夾中的項目):

回溯(最近通話最後一個): 文件 「C:\用戶\ Rokudoル\ Dropbox的\ 22c005 \ Python項目XML generation.py」,7號線,在 建宏.IOError:[錯誤2]沒有這樣的文件或目錄:糾正代碼

with open(fileName) as data: 

     #Read data and filter out whitespace 
     lines = [line.strip() for line in data.readlines()] 

     # Generating xml tags via slicing 
     xml = '\n'.join(['<{0:s}> {1:s} </{0:s}>'.format(tag, value) 
         for tag, value in zip(tags, lines)]) 

    print xml 

「的data.txt」

後,我得到一個回調的打印語句。

回溯: 回溯(最近通話最後一個): 文件 「C:\用戶\ foobar的\ XML generation.py」,第15行,在 語法錯誤:打印的xml:C:\用戶\ foobar的\ XML generation.py,line 1513

使用「return xml」編輯將其拍攝到shell中。 某些格式問題會修補並查看會發生什麼。

+0

那麼,你的代碼是如何失敗的呢?請提供追溯。這裏有一些錯誤,但很難判斷它們是否在你正在執行的代碼中,或者只是通過使用StackOverflow編輯器發佈來引入格式化問題。 –

+0

追加追溯。 – Yarou

+0

這不是問題,但是你的'xml ='\ n'.join()'調用會失敗,因爲你有不平衡的括號。你使用'<{0}> {1}'(最後一個花括號實際上是一個paren) –

回答

2

您的代碼有幾個問題,並且如評論中所述,很難判斷它們是否在您正在執行的代碼中,或者只是通過使用StackOverflow編輯器發佈來引入格式問題。

無論哪種方式,這是什麼地方錯了代碼:

  • 您使用的是data.txt相對路徑。此路徑將相對於您當前的工作目錄,而不是到您的Python腳本的位置。因此,請確保您運行data.txt所在的目錄中的代碼。,請使用類似open("/home/foo/data.txt")的絕對路徑。
  • 縮進已關閉。前兩行縮進一個空格,它們不應該是。
  • tagsxml第二行之前不會打開該文件屬於那裏,是一個語法錯誤
  • with語句是註釋的一部分: with open("data.txt") as data:應在自己的行,並且代碼它下面
  • 您使用的是</{0:s)>,而不是一個大括號

隨着該固定的規則右括號由4個空格縮進,你的代碼應該是這樣的:

tags = ['name', 'university', 'gpa', 'sat'] #Add desired 
xml = '' #Add xml parsing 

with open("data.txt") as data: 

    #read data and filter out whitespace 
    lines = [line.strip() for line in data.readlines()] 

    #Generating xml tags via slicing 
    xml = '\n'.join(['<{0:s}> {1:s} </{0:s}>'.format(tag, value) 
        for tag, value in zip(tags, lines)]) 

print xml 

其中產量

<name> John Smith </name> 
<university> Harvard </university> 
<gpa> 4.00 </gpa> 
<sat> 1600 </sat> 

所以它幾乎工作,你只需要爲封裝與開放的XML和關閉applicant標籤。

編輯: 工作目錄是程序(任何程序,而不僅僅是python)從何時開始使用shell的地方。如果您使用IDE,完全取決於該IDE如何處理/操作工作目錄,則需要查閱IDE的文檔。

您可以通過執行

import os 
print os.getcwd() 

應該幫助您確定您的工作目錄,或你的IDE設置它是打印在Python的工作目錄。

對於文件名傳遞作爲命令行參數,使用

import sys 
filename = sys.argv[1] 

和調用腳本就像python generate.py data.txt,從那裏data.txt實際上是目錄。

但是你的作業說:

Your job is to write a python program, called dataCode(fileName)

Python程序通常會被認爲是一個.py劇本,但dataCode(fileName)是一個函數簽名。所以你可能只是想把你的代碼包裝在這樣的函數中:

def dataCode(fileName): 
    # ... 
    with open(fileName) as data 
     # ... 
+0

無論是否在同一個文件中,絕對路徑總能正常工作?這很好,非常感謝。我對這門語言很陌生,所以我時不時會對語法感到困惑。我很欣賞代碼的輸入。 – Yarou