Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions frictionless/schemes/multipart/__spec__/test_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,17 @@ def test_multipart_loader_with_compressed_parts_issue_1215():
{"id": 1, "name": "english"},
{"id": 2, "name": "中国人"},
]


def test_multipart_loader_missing_trailing_newline(tmpdir):
tmpdir.join("chunk1.csv").write("id,name\n1,english")
tmpdir.join("chunk2.csv").write("id,name\n2,german\n")
with TableResource(
path=str(tmpdir.join("chunk1.csv")),
extrapaths=[str(tmpdir.join("chunk2.csv"))],
) as resource:
assert resource.header == ["id", "name"]
assert resource.read_rows() == [
{"id": 1, "name": "english"},
{"id": 2, "name": "german"},
]
5 changes: 5 additions & 0 deletions frictionless/schemes/multipart/loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,14 @@ def read(self, size: int):
return res

def read_line_stream(self):
last_line_had_terminator = True
for number, path in enumerate(self.__paths, start=1):
if number > 1 and not last_line_had_terminator:
yield b"\n"
last_line_had_terminator = True
with FileResource(path=path) as resource:
for line_number, line in enumerate(resource.byte_stream, start=1):
if not self.__headless and number > 1 and line_number == 1:
continue
last_line_had_terminator = line.endswith((b"\n", b"\r"))
yield line