Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python docx进行粗体、下划线和迭代_Python_Ascii_Python Docx - Fatal编程技术网

使用python docx进行粗体、下划线和迭代

使用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

我正在编写一个程序,从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_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}”。但实际上,现在还不清楚您在做什么,您应该避免使用注释来扩展多个后续查询。是时候问一个新的/单独的问题了,你会更有可能得到答案,因为更多的人会看到它。