2013-02-10 34 views
1

我正在嘗試在Python 2.7.3中編寫一個腳本,該腳本可以從Excel電子表格中獲取.csv文件並將其轉換爲適合LaTeX表格的格式。所以我想要讀取一個文件,並將數據寫入一個新的文本文件,但用任何逗號代替逗號,並在每行末尾附加一個雙反斜槓。在Python中連接file.write()中的字符串?

例如:
輸入

A1,A2,A3 
B1,B2,B3 
C1,C2,C3 

所需的輸出

A1 & A2 & A3 \\ 
B1 & B2 & B3 \\ 
C1 & C2 & C3 \\ 

這就是我現在所擁有的:

old_file = open(selected_file, "r") 
new_file = open("texified_" + selected_file.replace("csv","txt"), "w") 
#Creates new file with format texified_selected_file.txt 

for line in old_file: 
    new_file.write(line.replace(",", " & ") + r" \\") 

new_file.close() 
old_file.close() 

現在它正確地與符號代替了逗號,但不添加雙反斜槓。我認爲這是因爲反斜槓有特殊的含義,但即使將它作爲原始字符串,它仍然不起作用。但是,它確實將它添加到最後一行的末尾。

實際輸出

A1 & A2 & A3 
B1 & B2 & B3 
C1 & C2 & C3 \\ 
+0

如果我只是做'打印(線。替換(「,」,「&」)+ r「\\」)',那麼我只能得到最後一行打印。 – Peacemaker636 2013-02-10 21:39:39

+0

在我的系統上,實際輸出與您的不同,給出示例輸入。 – moooeeeep 2013-02-10 22:01:20

+0

@moooeeeep ..在我的系統上。我在前兩行的前面有兩個反斜槓。 – 2013-02-10 22:04:37

回答

0

我不知道什麼是錯與您的代碼(或輸入數據),但我「大概ð做類似這樣的(可能不太詳細):

for line in old_file: 
    line = line.strip()  # remove newline/whitespace from begin and end of line 
    line = line.split(',') # get comma-separated values 
    line = " & ".join(line) # make it ampersand-separated values 
    line += r" \\"   # add latex line break 
    line += "\n"   # add file line break 
    new_file.write(line) 

或者這樣說:

import jinja2 

# define the latex template 
template_str = r""" 
\documentclass{article} 
\begin{document} 
\begin{table} 
    \centering 
    \begin{tabular}{ccc} 
%{ for line in table %} %{{line[0]%}} & %{{line[1]%}} & %{{line[2]%}} \\ 
%{ endfor %} 
    \end{tabular} 
\end{table} 
\end{document} 

""" 

# initialize the rendering engine 
renderer = jinja2.Environment(
    block_start_string = '%{', 
    block_end_string = '%}', 
    variable_start_string = '%{{', 
    variable_end_string = '%}}' 
) 
template = renderer.from_string(template_str) 

# bring the data array into shape 
lines = [line.strip().split(',') for line in old_file] 

# generate the tex source code 
with open("test.tex", 'w+') as f: 
    f.write(template.render(table=lines)) 

也看看這些資源:

+0

這真的很有幫助。我想我有點頭痛了。我對Python非常陌生,我看到有機會使用它。我認爲.csv文件可以像.txt文件一樣對待,但我想我錯了。謝謝 – Peacemaker636 2013-02-10 22:16:13

1

即可能發生,因爲有一個newline已經在你的文件中的每一行的末尾,而不是在last line結束。

你可以嘗試剝離它,追加//前,然後分別加入新行: -

import os 
ls = os.linesep 

for line in old_file: 
    new_file.write(line.replace(",", " & ").rstrip() + r' \\ ' + ls) 
+0

我試過這段代碼,它有相同的結果,只在最後一行有反斜槓。還嘗試將'line.replace(「,」,「&」).rstrip()+ r'\\'+ ls'的結果存儲到一個變量中,並在'new_file.write()'中使用相同的結果。 – Peacemaker636 2013-02-10 21:34:49

+0

@ Peacemaker636。你只有一次反斜槓嗎?在最後一行結尾處也是如此?前兩行沒有?因爲這在我的情況下工作。 – 2013-02-10 21:37:55

+0

是的,只有一次在文件中,在最後一行的末尾。我只是使用.txt文件中的示例數據嘗試過它,它工作。但是,當我從Excel導出的.csv文件中嘗試它時,它不起作用。 – Peacemaker636 2013-02-10 21:44:59