2010-02-20 46 views
2

:)我有附加字位置的話從源文件 但如所期望的輸出是不來的碼:Python - 附加單詞位置編號。爲Unicode文本

輸入文件包含以下內容:

3. भारत का इतिहास काफी समृद्ध एवं विस्तृत है। 
57. जैसे आज के झारखंड प्रदेश से, उन दिनों, बहुत से लोग चाय बागानों में मजदूरी करने के उद्देश्य से असम आए। 

原始源代碼是這樣的:

#!/usr/bin/python 

    # -*- coding: UTF-8 -*- 

    # encoding: utf-8 

separators = [u'।', ',', '.'] 

text = open("hinstest1.txt").read() 

    #This converts the encoded text to an internal unicode object, where 

    # all characters are properly recognized as an entity: 

text = text.decode("UTF-8") 

    #this breaks the text on the white spaces, yielding a list of words: 

words = text.split() 



counter = 1 



output = "" 

    #if the last char is a separator, and is joined to the word: 

for word in words: 

    if word[-1] in separators and len(word) > 1: 

     #word up to the second to last char: 

     output += word[:-1] + u'(%d) ' % counter 

     counter += 1 

     #last char 

     output += word[-1] +u'(%d) ' % counter 

    else: 

     output += word + u'(%d) ' % counter 

     counter += 1 

    #for ch in word:  

    # if ch is '\n': 

    print output 

    #counter = 1 

此代碼的輸出是這樣的:

3(1) .(2) 
3(1) .(2) भारत(2) 
3(1) .(2) भारत(2) का(3) 
3(1) .(2) भारत(2) का(3) इतिहास(4) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) से(29) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) से(29) असम(30) 
3(1) .(2) भारत(2) का(3) इतिहास(4) काफी(5) समृद्ध(6) एवं(7) विस्तृत(8) है(9) ।(10) 57(10) .(11) जैसे(11) आज(12) के(13) झारखंड(14) प्रदेश(15) से(16) ,(17) उन(17) दिनों(18) ,(19) बहुत(19) से(20) लोग(21) चाय(22) बागानों(23) में(24) मजदूरी(25) करने(26) के(27) उद्देश्य(28) से(29) असम(30) आए(31) ।(32) 

我試圖修改上面的代碼,以便計數器檢測到一個新行並重新初始化字位置從1開始每一個新行,我還需要確保沒有字位置顯示爲序列號。

我修改後的代碼是不是100%正確,你可以幫我糾正,以獲得所需的輸出:

修改後的代碼看起來是這樣的:

#!/usr/bin/python 

    # -*- coding: UTF-8 -*- 
    # encoding: utf-8 
import fileinput 
list1 = [] 
separators = [u'।', ',', '.'] 
chknwlin = ['\n'] 
text = open("hinstest1.txt").read() 
output_file = ("ophwp1.txt") 
    #This converts the encoded text to an internal unicode object, where 

    # all characters are properly recognized as an entity: 

text = text.decode("UTF-8") 
    #this breaks the text on the white spaces, yielding a list of words: 

words = text.split() 

counter = 1 

output = "" 
    #if the last char is a separator, and is joined to the word: 

for line in words: 
    for word in line: 
     for ch in line: 

      if word[-1] in separators and len(word) > 1: 

       #word up to the second to last char: 

       output += word[:-1] + u'(%d) ' % counter 

       counter += 1 

       #last char 

       output += word[-1] +u'(%d) ' % counter 

      else : 

       output += word + u'(%d) ' % counter 

       counter += 1 
# if ch is '\n': 
      if ch in chknwlin: 

      #for ch in words: 

       print output 

       counter = 1 
        list1.append(output) 

#words.close() 

f1=open(output_file,'w') 

f1.write(' '.join(list1)) 

f1.close() 

我終於想輸出的樣子這個:

3. भारत(1) का(2) इतिहास(3) काफी(4) समृद्ध(5) एवं(6) विस्तृत(7) है(8) ।(9) 
57. जैसे(1) आज(2) के(3) झारखंड(4) प्रदेश(5) से(6) ,(7) उन(8) दिनों(9) ,(10) बहुत(11) से(12) लोग(13) चाय(14) बागानों(15) में(16) मजदूरी(17) करने(18) के(19) उद्देश्य(20) से(21) असम(22) आए(23) ।(24) 

修改後的代碼在控制檯上沒有給我任何輸出,也沒有向輸出文件複製任何內容。

我急需你的幫助..請..我是python的新手我真的陷入了這個問題。我會很感激的任何幫助謝謝.. :)

回答

1

這段代碼會給你想要的輸出。我在該行的開頭添加了一個數字檢查,該數字不應該被編號。

我改編了你原來的代碼,這是(主要)工作。您只需在輸入行末尾重置計數器,並在輸出中添加換行符。

#!/usr/bin/python 
# -*- coding: UTF-8 -*- 
# encoding: utf-8 

import re 

list1 = [] 
separators = [u'।', ',', '.'] 
text = open('hinstest1.txt').read().decode('UTF-8') 
output_file = ('ophwp1.txt') 

for line in text.splitlines(): 
    counter = 1 
    output = '' 
    for word in line.split(): 
     # Special case for the number at the start of the line 
     # The regex matches one or more decimal digits (\d+) followed by a dot (\.) 
     if re.match(r'\d+\.', word): 
      output += word + ' ' 
      continue 
     # Special case: the last char is a separator joined to the word 
     if word[-1] in separators and len(word) > 1: 
      # word up to the second to last char 
      output += word[:-1] + u'(%d) ' % counter 
      counter += 1 
      # last char 
      output += word[-1] + u'(%d) ' % counter 
      counter += 1 
     else: 
      output += word + u'(%d) ' % counter 
      counter += 1 
    output += u'\n' 
    list1.append(output.encode('UTF-8')) 

f1=open(output_file,'w') 
f1.write(''.join(list1)) 
f1.close() 

我在您提供的輸入文件上測試了這個代碼,並且在大多數情況下,我保留了您的編碼風格。

+0

非常感謝您的時間...... :)代碼有效非常好.. :)再次感謝Danilo .. :) – boddhisattva 2010-02-20 14:15:20

0

嘗試改變:

counter = 1 
for line in words: 
    # etc... 

到:

for line in words: 
    counter = 1 
    # etc... 

這將計數器重置爲1爲每個新線。

+0

你好先生.. :)謝謝你的回答。我可以通過我的項目指南和python映射幫助解決以前的查詢問題,首先在字典中放置'AA'等字符,然後'A'(我希望你記得我們正在討論這個)我試過它沒有工作,我仍然沒有得到在控制檯或文件中的任何操作,先生,我怎麼也可以防止序列號。從具有字的位置,如果你可以請看看它也先生,因爲這也是一個額外的問題。 – boddhisattva 2010-02-20 12:43:03

2

我覺得你的代碼應該是這樣的:

# the input part is fine as is 
lines = text.split('\n') 
outlines = [] 
for line in lines: 
    lout = [] 
    counter = 1 
    for i, word in enumerate(lines.split()): 
     if i == 0: # leave 1st word of line alone, it's a marker: 
      lout.append(word) 
      continue 
     # process each and every other word 
     if word[-1] in separators and len(word) > 1: 
      lout.append(word[:-1] + (u'(%d) ' % counter) + 
         word[-1] + (u'(%d) ' % counter+1)) 
      counter += 1 
     else : 
      lout.append(word + u'(%d)' % counter) 
     counter += 1 
    outlines.append(' '.join(lout)) 

f1=open(output_file,'w') 
f1.write('\n'.join(outlines)) 
f1.close() 

不能對此進行測試的代碼,所以有可能會留下一些小問題,但我認爲它的主要原則是合理的:在兩個層面上的工作(一行一行,用\n作爲分隔符,用空格作爲分隔符,用空格作爲分隔符),每次使用列表(使用append和join),而不是逐段建立字符串。

+0

你好先生.. :)謝謝你的回答。我能夠通過我的項目指南和Python中的映射幫助解決以前的查詢,首先在字典中放置'AA'等字符,然後'A'(我希望你記得我們正在討論這個問題,甚至是Mark Byers爵士)。先生,你是Python Cookbook和Python在NutShell中的作者。獲得你的指導是一種榮譽爵士...... :)謝謝.... :)上帝保佑.. – boddhisattva 2010-02-20 14:36:11

+0

@mgj,yep我寫了食譜和果殼,tx爲客氣話。有趣的是得到客氣的話,但沒有upvote ;-)。 – 2010-02-20 16:04:28

+0

不要難過,我向你致敬:-)。有趣的是,你發現不是upvoting有趣的,但不是使用「Sir」。 – 2010-02-20 17:31:33