如何在python中分别读取2行

时间:2017-09-01 15:06:26

标签: python python-3.x

这是我的第一个问题!

我有一个包含数百行的文件,例如:

<car> <part_of> <machine>     
<motor> <part_of> <car>       

每一行代表主题,关系,对象

我想分别读取每两行,处理它们,然后根据输入文件输出2行或3行。 我做了这样的事情:

    opener = open('input.txt')        # to read even lines
    opener2 = open('input.txt')       # to read odd lines
    num = 2
    for eachline in opener:
        if num % 2 == 0:
            line1 = opener.readline().split()
            sub_line1, rel_line1, obj_line1 = line1[0],line1[1],line1[2]
            sub_line1 = line1[0].lstrip("<").rstrip(">")
            rel_line1 = line1[1].lstrip("<").rstrip(">")
            obj_line1 = line1[2].lstrip("\"").rstrip("\"")
        else:
            line2 = opener2.readline().split()
            sub_line2, rel_line2, obj_line2 = line1[0],line2[1],line2[2]
            sub_line2 = line2[0].lstrip("<").rstrip(">")
            rel_line2 = line2[1].lstrip("<").rstrip(">")
            obj_line2 = line2[2].lstrip("\"").rstrip("\"")
        num += 1

我为输出做了这个:

output1 = " ".join([sub_line1,rel_line1,obj_line1])
writer.write(output1+"\n")
output2 = " ".join([sub_line2,rel_line2,obj_line2])
writer.write(output2+'\n')
output3 = " ".join([sub_line1,relation,sub_line2])
writer.write(output3+'\n')

注意:输入中不存在output3。我通过组合前两行来添加它。但每次奇数线被偶数重写。我该如何分开它们?

示例输出:

<car> <part_of> <machine>
<motor> <part_of> <car>
<car> <part_of> <motor>

每个第3行基于前2行组成。

第2部分:

如果输入文件中有一行,以“_”开头,我怎么能按原样输出它而不将其作为我正在处理的2行之一?我在哪里可以说这个条件?

提前致谢!!

2 个答案:

答案 0 :(得分:2)

您无法获取文件描述符(open返回的内容)只能读取奇数行或偶数行。 它必须读取文件 1 的全部内容。

但是,因此,您不需要拥有两个文件描述符:只能使用一个文件描述符。 您可以迭代enumerate(file)而不是file。 它不会给你提供线条,而是会给你(index, line)对夫妻。 您可以通过for id, line in enumerate(file)解压缩此问题,然后按id检查2的剩余部分,以确定它是奇数还是偶数。

file = open(path, 'r')
for id, line in enumerate(file):
    if id % 2 == 0:
        # The line is even
    else:
        # The line is odd

1 公平地说,可以获取一个文件描述符,只读取奇数或偶数行,因为你可以跳过其他所有行...但是,当一个人已经完成这项工作时,为什么还要创建两个描述符呢?

答案 1 :(得分:1)

目前尚不清楚为什么需要分离迭代器;一次只读两行:

with open('input.txt') as fh:
    while True:
        line1 = fh.readline()
        line2 = fh.readline()
        if not line1:
            break
        ...

如果 line1line2 itertoolsfrom itertools import tee, islice, izip with open('input.txt') as fh: # Get two copies of the iterator. IMPORTANT: don't use fh # anymore; only itr1 and itr2 itr1, itr2 = tee(fh) itr1 = islice(itr1, 0, None, 2) # 0, 2, 4, ... itr2 = islice(itr2, 1, None, 2) # 1, 3, 5, ... for line1, line2 in izip(itr1, itr2): ... 为空,则可以修改中断条件,例如文件的行数为奇数。 / p>

但是,如果由于某种原因需要单独的迭代器,请让每个迭代器负责跳过所有其他行。使用 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragment_container" android:name="android.app.DialogFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.chetan.fragmentprtc.MainActivity" /> 模块可以轻松实现:

package com.example.chetan.fragmentprtc;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

  FragmentTransaction transaction = 
 getFragmentManager().beginTransaction();
BlankFragment fragment = new BlankFragment();
transaction.replace(R.id.fragment_container, fragment);
transaction.addToBackStack(null);

transaction.commit();


 }
}