python文件式运行怎么输入多行文字_如何在Python中插入文本文件的N行

博客内容讲述了如何将disp.txt文件中的数据转换为disp.mol格式,涉及到读取文件、数据分组和写入新文件的过程。通过使用Python代码实现了从原始文件中提取特定振动数据并按指定格式输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1586010002-jmsa.png

Hello I'm trying to convert the file disp.txt from:

116 C 0.12 -0.91 0.39 -0.40 0.31 0.85 -0.66 -0.18 -0.22

117 O 0.00 -0.02 0.00 -0.05 0.05 0.12 -0.57 -0.26 -0.29

116 C -0.03 -0.04 0.00 0.01 0.09 0.19 -0.71 -0.21 -0.26

117 O -0.14 0.88 -0.45 0.47 -0.33 -0.79 0.57 0.16 0.19

to disp.mol:

vibration 1

0.12 -0.91 0.39

0.0 -0.02 0.0

vibration 2

-0.4 0.31 0.85

-0.05 0.05 0.12

vibration 3

-0.66 -0.18 -0.22

-0.57 -0.26 -0.29

vibration 4

-0.03 -0.04 0.00

-0.14 0.88 -0.45

vibration 5 ...

I opened the disp.txt file using with open('disp.txt', 'w') as f:

Read in the lines using lines = f.readlines()

split the data using for x in lines: numbers = x.split()

then

vib1.append(float(numbers[2])), vib2.append and stored them in

vib1=[], vib2=[], etc.

My problem arises when I need to put the data that I've stored in the format in disp.mol. With the code below I'm able to get output for the first three vibrations from the first two lines but I'm not sure how to perform the same loop on the next two 2 lines (as well as if I had more 2N lines). I'm also not sure how to number each vibration. Any help with this would be appreciated.

with open('disp.mol', 'w') as thisfile:

thisfile.writelines('vibration')

thisfile.writelines('\n')

for x in range (0, 2):

vib_one = str(vib1[x]) + ' ' + str(vib2[x]) + ' ' + str(vib3[x])

thisfile.writelines(vib_one)

thisfile.writelines('\n')

thisfile.writelines('vibration')

thisfile.writelines('\n')

for x in range (0, 2):

vib_two = str(vib4[x]) + ' ' + str(vib5[x]) + ' ' + str(vib6[x])

thisfile.writelines(vib_two)

thisfile.writelines('\n')

thisfile.writelines('vibration')

thisfile.writelines('\n')

for x in range (0, 2):

vib_three = str(vib7[x]) + ' ' + str(vib8[x]) + ' ' + str(vib9[x])

thisfile.writelines(vib_three)

thisfile.writelines('\n')

Output:

vibration

0.12 -0.91 0.39

0.0 -0.02 0.0

vibration

-0.4 0.31 0.85

-0.05 0.05 0.12

vibration

-0.66 -0.18 -0.22

-0.57 -0.26 -0.29

解决方案

Here's a way to do it:

with open('disp.txt') as f, open('disp.mol','w') as out:

vibration = 1

for line in f:

line1 = line.split()

line2 = next(f).split() # also get next line

for i in range(2,len(line1),3):

out.write('vibration {}\n'.format(vibration))

out.write(' '.join(line1[i:i+3])+'\n')

out.write(' '.join(line2[i:i+3])+'\n')

vibration += 1

Output:

vibration 1

0.12 -0.91 0.39

0.00 -0.02 0.00

vibration 2

-0.40 0.31 0.85

-0.05 0.05 0.12

vibration 3

-0.66 -0.18 -0.22

-0.57 -0.26 -0.29

vibration 4

-0.03 -0.04 0.00

-0.14 0.88 -0.45

vibration 5

0.01 0.09 0.19

0.47 -0.33 -0.79

vibration 6

-0.71 -0.21 -0.26

0.57 0.16 0.19

<think>我们有一个明确的任务:在Python中读取txt文件并在第一插入内容。 方法:我们可以先读取原文件的所有内容,然后将新内容作为第一,再入原文件的内容。 步骤: 1. 打开文件,读取所有。 2. 在列表的最前面插入新的一(注意换符)。 3. 将新的列表入文件(可以覆盖原文件,也可以入新文件,这里我们覆盖原文件)。 注意:如果文件很大,一次性读取可能占用内存,但对于一般大小的文件,这是简单有效的方法。 我们也可以考虑使用临时文件,但这里我们直接采用读取-修改-回的方式。 示例代码: 假设我们要在文件的第一插入字符串"这是新插入的第一"。 但是注意:原文件可能没有换符,所以插入后要确保格式正确。我们可以在插入的内容后面加上换符,这样原来的第一就变成了第二。 具体操作: 1. 读取文件所有到列表lines。 2. 在列表开头插入(带换符)或者插入后,再重新组合。 有两种情况: a) 插入的内容不带换符,那么我们需要在插入的内容后面加上换符,以免与原来的第一连在一起。 b) 或者我们插入的内容本身就是一个完整的(即末尾有换符)。 这里我们假设用户想要插入的内容是一个字符串,并且希望它成为独立的一。因此,我们在插入的内容后面加上换符,除非它已经包含。 但为了安全,我们可以这样:在插入的内容末尾添加一个换符(如果它还没有换符的话),然后插入到列表开头。 然而,更简单的方法是:我们读取整个文件,然后将新内容和原来的内容合并,再回。 另一种方法:不用逐读取,而是整个读取,然后组合。 代码示例: 方法一:逐读取 with open('file.txt', 'r') as f: lines = f.readlines() # 在列表最前面插入 lines.insert(0, "这是新插入的第一\n") # 注意加上换符 # 重新入文件 with open('file.txt', 'w') as f: f.writelines(lines) 但是,如果原文件第一没有换符,那么插入后第一和第二会连在一起吗?不会,因为我们插入的内容已经带换符了,所以原来的第一会换。 但是,如果原文件是空的,这样操作也没有问题,因为lines为空列表,插入后只有一。 方法二:一次性读取整个文件内容,然后拼接字符串 with open('file.txt', 'r') as f: content = f.read() new_content = "这是新插入的第一\n" + content with open('file.txt', 'w') as f: f.write(new_content) 两种方法都可以。 但是,如果文件很大,方法一(逐读取为列表)和方法二(一次性读取整个字符串)都会占用大量内存。对于大文件,我们可以使用临时文件,逐入,但这样需要更多的IO操作。 不过,对于大多数情况,文件不会太大,所以我们可以使用上述方法。 这里我们选择方法二,因为它更简洁。 但是,如果原文件是二进制文件或者有编码问题,我们需要指定编码。这里假设是文本文件。 完整代码: 注意:如果文件不存在,我们需要处理异常。 下面是一个健壮性更好的版本: 代码: file_path = 'your_file.txt' try: with open(file_path, 'r', encoding='utf-8') as f: # 根据文件实际编码调整 content = f.read() except FileNotFoundError: print(f"文件 {file_path} 不存在") # 或者可以选择创建文件并入第一 # 这里我们根据需求,如果文件不存在,我们可以创建并入第一 with open(file_path, 'w', encoding='utf-8') as f: f.write("这是新插入的第一\n") else: # 文件存在,我们读取后重新入 new_content = "这是新插入的第一\n" + content with open(file_path, 'w', encoding='utf-8') as f: f.write(new_content) 但是,如果用户希望插入的内容是变量,我们可以将其作为变量传入。 根据用户的问题,他可能希望插入任意内容。所以我们可以一个函数: def insert_first_line(file_path, line_text): # 确保line_text以换符结尾,除非用户不希望这样? # 但是,我们插入的是一整,所以通常我们希望它独占一,因此我们在后面加换符 if not line_text.endswith('\n'): line_text += '\n' try: with open(file_path, 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: # 文件不存在,则创建文件并入这一 with open(file_path, 'w', encoding='utf-8') as f: f.write(line_text) else: new_content = line_text + content with open(file_path, 'w', encoding='utf-8') as f: f.write(new_content) 调用: insert_first_line('test.txt', '这是第一') 注意:如果原文件很大,这种方法会占用较多内存。对于大文件,我们可以使用临时文件,逐,但这样代码复杂一些。 大文件处理方法(使用临时文件): import os def insert_first_line_large(file_path, line_text): if not line_text.endswith('\n'): line_text += '\n' import tempfile temp_file = tempfile.NamedTemporaryFile('w', delete=False, encoding='utf-8') try: with open(file_path, 'r', encoding='utf-8') as old_file: # 先入新 temp_file.write(line_text) # 然后复制原文件内容 for line in old_file: temp_file.write(line) except FileNotFoundError: # 文件不存在,则创建 with open(file_path, 'w', encoding='utf-8') as f: f.write(line_text) return else: temp_file.close() # 用临时文件替换原文件 os.replace(temp_file.name, file_path) 但是,这种方法在入过程中如果出现错误,可能会破坏原文件。因此,更安全的方式是备份原文件,但这样会增加额外开销。 对于大多数情况,文件不会太大,所以我们使用第一种方法即可。 因此,我们给用户提供第一种简单的方法。 注意:在入时,如果程序在入过程中中断,可能会导致文件丢失(因为先清空再入)。所以,如果对文件安全性要求很高,应该使用备份。 但是,对于用户的一般需求,我们使用简单方法。 总结:我们使用第一种方法,即读取整个文件内容,然后拼接字符串再回。 代码示例: # 定义函数 def insert_first_line(file_path, new_line): # 确保新有换符 if not new_line.endswith('\n'): new_line += '\n' try: # 读取原文件内容 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() except FileNotFoundError: # 文件不存在,则创建文件并入新 with open(file_path, 'w', encoding='utf-8') as f: f.write(new_line) else: # 将新和原内容拼接 new_content = new_line + content with open(file_path, 'w', encoding='utf-8') as f: f.write(new_content) # 调用 insert_first_line('example.txt', '这是插入的第一') 如果用户想要插入多行,可以稍作修改,将new_line改为多行字符串(每以换符结尾),然后插入。 但是,根据问题,用户只要求在第一插入内容,所以我们假设插入的是一。 如果用户想要插入多行,可以传入一个包含换符的字符串。 例如:insert_first_line('example.txt', '第一\n第二') 这样就会插入。 因此,我们的函数已经支持插入多行(因为我们在前面拼接整个字符串)。 但是,如果用户传入的多行字符串最后没有换符,那么原文件的第一就会和插入的最后一连在一起。所以,我们建议用户确保传入的字符串最后有一个换符,或者我们在函数内部处理:在最后添加一个换符,但这样可能会多出一个空。 所以,我们保持函数内部只对传入的字符串检查最后是否有换符,如果没有则添加一个。这样,如果用户传入的是多行字符串,且最后一没有换符,我们添加一个,这样原文件内容就会在下一。 这样处理是合理的。 因此,函数保持不变。 现在,我们回答用户的问题:如何在Python中读取txt文件并在第一插入内容。 我们提供了上述函数,并解释了原理。 注意:如果文件非常大(比如几个GB),那么一次性读取可能占用太多内存,这时应该使用第二种逐的方法(使用临时文件)。但是,对于大文件,我们也可以使用文件指针移动等高级操作?实际上,在文件开头插入内容通常需要重整个文件,所以大文件的操作代价较高。 因此,我们根据文件大小选择方法。但为了简单,我们默认使用第一种方法。 最后,我们给出完整的代码示例。 另外,用户可能没有指定编码,所以我们可以使用通用的'utf-8',或者让用户指定。 我们可以改进函数,让用户指定编码,默认为'utf-8'。 修改后的函数: def insert_first_line(file_path, new_line, encoding='utf-8'): if not new_line.endswith('\n'): new_line += '\n' try: with open(file_path, 'r', encoding=encoding) as f: content = f.read() except FileNotFoundError: with open(file_path, 'w', encoding=encoding) as f: f.write(new_line) else: new_content = new_line + content with open(file_path, 'w', encoding=encoding) as f: f.write(new_content) 这样,用户可以根据需要调整编码。 示例调用: insert_first_line('test.txt', '第一内容') 或者: insert_first_line('test.txt', '第一内容', encoding='gbk') 现在,我们可以回答用户了。</think>### 在 Python 中读取 TXT 文件并在第一插入内容 在 Python 中向 TXT 文件的第一插入内容,可以通过以下步骤实现: #### 方法 1:读取全部内容后重(推荐) ```python def insert_first_line(file_path, new_content): try: # 读取原文件内容 with open(file_path, 'r', encoding='utf-8') as f: original_content = f.read() # 在开头插入新内容 new_content = f"{new_content}\n" # 确保换 updated_content = new_content + original_content # 回文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(updated_content) return True except Exception as e: print(f"操作失败: {e}") return False # 使用示例 insert_first_line('data.txt', '这是插入的第一内容') ``` #### 方法 2:使用临时文件(适合大文件) ```python import os import shutil def insert_first_line_safe(file_path, new_content): try: temp_file = f"{file_path}.tmp" with open(file_path, 'r', encoding='utf-8') as fin, \ open(temp_file, 'w', encoding='utf-8') as fout: # 先入新内容 fout.write(f"{new_content}\n") # 复制原内容 shutil.copyfileobj(fin, fout) # 替换原文件 os.replace(temp_file, file_path) return True except Exception as e: print(f"操作失败: {e}") return False ``` #### 关键说明: 1. **换符处理**:务必在新内容末尾添加 `\n`,否则会导致首与第二合并 2. **文件编码**:使用与文件匹配的编码(如 `utf-8`, `gbk`),否则可能出现乱码 3. **异常处理**:包含 `try-except` 防止文件不存在或权限错误导致程序崩溃 4. **大文件优化**:方法 2 使用流式处理,内存占用更少(适用于 >100MB 的文件) #### 应用场景示例: ```python # 在日志文件中添加标题 insert_first_line('app.log', '==== 系统日志 ====') # 在 CSV 文件添加表头 insert_first_line('data.csv', 'ID,Name,Value') ``` > **注意事项**: > 1. 文件路径需使用原始字符串或双反斜杠(如 `r'C:\data.txt'` 或 `'C:\\data.txt'`) > 2. 操作前建议备份重要文件 > 3. 若需保留原文件尾符(`\r\n` 或 `\n`),可使用 `'r+'` 模式配合 `readlines()`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值