#!/bin/bash # ideone boilerplate - we can't write files in the home directory; # so create a temporary directory for our files instead t=$(mktemp -d -t ideone.XXXXXXXXXXXX) || exit trap 'rm -rf "$t"' ERR EXIT cd "$t" init() { printf 'one %s\n' {1..5} >test1.txt printf 'two %s\n' {1..50} >test2.txt } init nl *.txt cat <<\_ >demo.py # insert contents of "test1.txt" into "test2.txt" at line 20 with open("test1.txt", "r") as f1: t1 = f1.readlines() with open("test2.txt", "r") as f2: t2 = f2.readlines() t2.insert(20, t1) with open("test2.txt", "w") as f2: f2.writelines(t2) _ python3 demo.py 2>&1 || echo '** Original failed' cat <<\_ >demo2.py # insert contents of "test1.txt" into "test2.txt" at line 20 with open("test2.txt", "r+") as f2: for x in range(20): f2.readline() # skip past early lines pos = f2.tell() # remember insertion position f2_remainder = f2.read() # cache the rest of f2 f2.seek(pos) with open("test1.txt", "r") as f1: f2.write(f1.read()) f2.write(f2_remainder) _ python3 demo2.py nl test2.txt echo '** Incorrect output above; try fixed version' init cat <<\_ >demo3.py with open("test2.txt", "r+") as f2: for x in range(20): f2.readline() # skip past early lines pos = f2.tell() # remember insertion position f2_remainder = f2.read() # cache the rest of f2 f2.seek(pos) with open("test1.txt", "r") as f1: for line in f1: f2.write(line) f2.write(f2_remainder) _ python3 demo3.py nl test2.txt echo "** pavot.kutaj's version" cat <<\_ >demo4.py def main(): with open("test2.txt", mode="rt", encoding="utf-8") as f1: source_list = [line.strip() for line in f1.readlines()] with open("test1.txt", mode="rt", encoding="utf-8") as f2: insert_list = [line.strip() for line in f2.readlines()] pos = source_list.index("two 21") source_list[pos: pos] = insert_list #a bit counter-intuitive slicing-approach with open("test2.txt", mode="w", encoding="utf-8") as f1: f1.write("\n".join(source_list)) if __name__ == "__main__": main() _ init python3 demo4.py nl test2.txt
Standard input is empty
1 one 1
2 one 2
3 one 3
4 one 4
5 one 5
6 two 1
7 two 2
8 two 3
9 two 4
10 two 5
11 two 6
12 two 7
13 two 8
14 two 9
15 two 10
16 two 11
17 two 12
18 two 13
19 two 14
20 two 15
21 two 16
22 two 17
23 two 18
24 two 19
25 two 20
26 two 21
27 two 22
28 two 23
29 two 24
30 two 25
31 two 26
32 two 27
33 two 28
34 two 29
35 two 30
36 two 31
37 two 32
38 two 33
39 two 34
40 two 35
41 two 36
42 two 37
43 two 38
44 two 39
45 two 40
46 two 41
47 two 42
48 two 43
49 two 44
50 two 45
51 two 46
52 two 47
53 two 48
54 two 49
55 two 50
Traceback (most recent call last):
File "demo.py", line 8, in <module>
f2.writelines(t2)
TypeError: write() argument must be str, not list
** Original failed
1 two 1
2 two 2
3 two 3
4 two 4
5 two 5
6 two 6
7 two 7
8 two 8
9 two 9
10 two 10
11 two 11
12 two 12
13 two 13
14 two 14
15 two 15
16 two 16
17 two 17
18 two 18
19 two 19
20 two 20
21 one 1
22 one 2
23 one 3
24 one 4
25 one 5
** Incorrect output above; try fixed version
1 two 1
2 two 2
3 two 3
4 two 4
5 two 5
6 two 6
7 two 7
8 two 8
9 two 9
10 two 10
11 two 11
12 two 12
13 two 13
14 two 14
15 two 15
16 two 16
17 two 17
18 two 18
19 two 19
20 two 20
21 one 1
22 one 2
23 one 3
24 one 4
25 one 5
26 two 21
27 two 22
28 two 23
29 two 24
30 two 25
31 two 26
32 two 27
33 two 28
34 two 29
35 two 30
36 two 31
37 two 32
38 two 33
39 two 34
40 two 35
41 two 36
42 two 37
43 two 38
44 two 39
45 two 40
46 two 41
47 two 42
48 two 43
49 two 44
50 two 45
51 two 46
52 two 47
53 two 48
54 two 49
55 two 50
** pavot.kutaj's version
1 two 1
2 two 2
3 two 3
4 two 4
5 two 5
6 two 6
7 two 7
8 two 8
9 two 9
10 two 10
11 two 11
12 two 12
13 two 13
14 two 14
15 two 15
16 two 16
17 two 17
18 two 18
19 two 19
20 two 20
21 one 1
22 one 2
23 one 3
24 one 4
25 one 5
26 two 21
27 two 22
28 two 23
29 two 24
30 two 25
31 two 26
32 two 27
33 two 28
34 two 29
35 two 30
36 two 31
37 two 32
38 two 33
39 two 34
40 two 35
41 two 36
42 two 37
43 two 38
44 two 39
45 two 40
46 two 41
47 two 42
48 two 43
49 two 44
50 two 45
51 two 46
52 two 47
53 two 48
54 two 49
55 two 50