使用python docx进行粗体、下划线和迭代
我正在编写一个程序,从ASCII文件中获取数据,并将数据放在Word文档中的适当位置,只将特定的单词加粗并加下划线。我是Python新手,但我在Matlab编程方面有丰富的经验。我的代码是:使用python docx进行粗体、下划线和迭代,python,ascii,python-docx,Python,Ascii,Python Docx,我正在编写一个程序,从ASCII文件中获取数据,并将数据放在Word文档中的适当位置,只将特定的单词加粗并加下划线。我是Python新手,但我在Matlab编程方面有丰富的经验。我的代码是: #IMPORT ASCII DATA AND MAKE IT USEABLE #Alternatively Pandas - gives better table display results import pandas as pd data = pd.read_csv('203792_M-51_Nile
#IMPORT ASCII DATA AND MAKE IT USEABLE
#Alternatively Pandas - gives better table display results
import pandas as pd
data = pd.read_csv('203792_M-51_Niles_control_SD_ACSF.txt', sep=",",
header=None)
#print data
#data[1][3] gives value at particular data points within matrix
i=len(data[1])
print 'Number of Points imported =', i
#IMPORT WORD DOCUMENT
import docx #Opens Python Word document tool
from docx import Document #Invokes Document command from docx
document = Document('test_iteration.docx') #Imports Word Document to Modify
t = len(document.paragraphs) #gives the number of lines in document
print 'Total Number of lines =', t
#for paragraph in document.paragraphs:
# print(para.text) #Prints the text in the entire document
font = document.styles['Normal'].font
font.name = 'Arial'
from docx.shared import Pt
font.size = Pt(8)
#font.bold = True
#font.underline = True
for paragraph in document.paragraphs:
if 'NORTHING:' in paragraph.text:
#print paragraph.text
paragraph.text = 'NORTHING: \t', str(data[1][0])
print paragraph.text
elif 'EASTING:' in paragraph.text:
#print paragraph.text
paragraph.text = 'EASTING: \t', str(data[2][0])
print paragraph.text
elif 'ELEV:' in paragraph.text:
#print paragraph.text
paragraph.text = 'ELEV: \t', str(data[3][0])
print paragraph.text
elif 'CSF:' in paragraph.text:
#print paragraph.text
paragraph.text = 'CSF: \t', str(data[8][0])
print paragraph.text
elif 'STD. DEV.:' in paragraph.text:
#print paragraph.text
paragraph.text = 'STD. DEV.: ', 'N: ', str(data[5][0]), '\t E: ',
str(data[6][0]), '\t EL: ', str(data[7][0])
print paragraph.text
#for paragraph in document.paragraphs:
#print(paragraph.text) #Prints the text in the entire document
#document.save('test1_save.docx') #Saves as Word Document after Modification
我的问题是如何只制作北距:粗体和下划线:
paragraph.text = 'NORTHING: \t', str(data[1][0])
print paragraph.text
因此,我编写了一个伪find and replace命令,如果所有被替换的值都完全相同,该命令将非常有效。但是,我需要用ASCII文件第二个数组中的值替换第二段中的值,用第三个数组中的值替换第三段..等等。我必须使用find和replace,因为文档的格式对我来说是高级的,我可以在程序中复制,除非有一个程序可以读取Word文件并将编程写回Python脚本……对它进行反向工程
我还在学习,所以代码对你来说可能很粗糙。我只是想自动化这个无聊的复制和粘贴过程。未经测试,但假设python docx与python pptx类似,它应该是由同一个开发人员维护的,粗略地回顾一下文档,就会发现它与PPT/DOC文件的接口方式是相同的,使用相同的方法,等等 为了操纵段落或单词的子字符串,您需要使用run对象: 实际上,这类似于:
for paragraph in document.paragraphs:
if 'NORTHING:' in paragraph.text:
paragraph.clear()
run = paragraph.add_run()
run.text = 'NORTHING: \t'
run.font.bold = True
run.font.underline = True
run = paragraph.add_run()
run.text = str(data[1][0])
从概念上讲,您可以为需要操纵的段落/文本的每个部分创建一个运行实例。所以,首先我们用粗体字体创建一个运行,然后我们添加另一个运行,我认为它不会是粗体/下划线,但如果它只是设置为False
注意:最好将所有导入语句放在模块的顶部
这可以通过使用像字典这样的映射对象来进行一些优化,您可以使用它将匹配值NORTHING关联为键,将段落文本的其余部分关联为值。也未经测试
未经测试,但假设python docx与python pptx类似,它应该是由同一个开发人员维护的,粗略地查看文档表明它与PPT/DOC文件的接口方式是相同的,使用相同的方法,等等 为了操纵段落或单词的子字符串,您需要使用run对象: 实际上,这类似于:
for paragraph in document.paragraphs:
if 'NORTHING:' in paragraph.text:
paragraph.clear()
run = paragraph.add_run()
run.text = 'NORTHING: \t'
run.font.bold = True
run.font.underline = True
run = paragraph.add_run()
run.text = str(data[1][0])
从概念上讲,您可以为需要操纵的段落/文本的每个部分创建一个运行实例。所以,首先我们用粗体字体创建一个运行,然后我们添加另一个运行,我认为它不会是粗体/下划线,但如果它只是设置为False
注意:最好将所有导入语句放在模块的顶部
这可以通过使用像字典这样的映射对象来进行一些优化,您可以使用它将匹配值NORTHING关联为键,将段落文本的其余部分关联为值。也未经测试
谢谢你的快速回复!我在尝试使用字典时收到此错误:对于数据目录中的k,v。items:TypeError:“内置函数”或“方法”对象不可编辑,可能它与for循环中的k,v不同?@CorySmith抱歉,请添加括号。对于数据目录项中的k,v:这很有效!现在我尝试遍历数据矩阵的行。我试图将数据_dict={'NORTHING:':data[1][I],…run.text='{0}中的值替换为零“.formatv…I=I+1,但是这不起作用。你能给我指出正确的方向吗。在Matlab中,我本可以在一个while循环内完成for循环,但字典把我甩了……你不能在字典构造函数中放入一个未定义的变量,所以这不起作用。但是你可以只使用数据[1]和数据[2]在字典中,然后在循环中执行“{0}”。formatv[i]假设我是您的迭代器/计数器。但实际上,现在还不清楚您在做什么,您应该避免使用注释来扩展多个后续查询。是时候问一个新的/单独的问题了,您将更有可能得到答案,因为更多的人会看到它。感谢您的快速响应!我收到了这个错误或者当尝试使用字典时:对于k,v in data_dict.items:TypeError:“builtin_function_或_method”对象不可iterable可能它不喜欢同一for循环中的k,v?@CorySmith抱歉,添加一个括号。对于k,v in data_dict.items:成功了!现在我正在尝试遍历数据矩阵的行。我尝试重新计算ce到数据中的零_dict={'NORTHING:':data[1][I],…run.text='{0}“.formatv…I=I+1,但是这不起作用。你能给我指出正确的方向吗。在Matlab中,我本可以在一个while循环内完成for循环,但字典把我甩了……你不能在字典构造函数中放入一个未定义的变量,所以这不起作用。但是你可以只使用数据[1] 和字典中的数据[2],然后在循环中执行“{0}”。但实际上,现在还不清楚您在做什么,您应该避免使用注释来扩展多个后续查询。是时候问一个新的/单独的问题了,你会更有可能得到答案,因为更多的人会看到它。