BatchRead[filename_String] := Module[{firstline, input, current}, Unprotect[In, Out, InString]; For[ (* init *) firstline = $Line; input = OpenRead[filename]; Print[""]; current = Read[input, HoldForm[Expression] ], (* continuation condition *) current =!= EndOfFile, (* increment *) current = Read[input, HoldForm[Expression]], (* body *) ++$Line; SetDelayed @@ Join[HoldForm[In[$Line]], current]; InString[$Line] = ToString[InputForm /@ current]; Print @ StringForm["In[`1`] := `2`", $Line, InString[$Line] ]; Print[" "]; Out[$Line] = ReleaseHold[current]; Print[StringForm["Out[`1`] = ", $Line], Out[$Line] ]; Print[" "]; Print[" "] ]; Close[input]; Out[firstline] = Out[$Line]; Protect[In, Out, InString]; Out[$Line] ] (* This version is written in a procedural style, which step-by-step reads the file. A more functional version can be written which reads in all the inputs at once, and then applies a function to them. This might be less suitable for a large file due to the memory needed to store everything at once: *) loop[HoldForm[input_]] := ( ++$Line; In[$Line] := input; InString[$Line] = ToString[InputForm /@ HoldForm[input]]; Print @ StringForm["In[`1`] := `2`", $Line, InString[$Line] ]; Print[" "]; Out[$Line] = input; Print @ StringForm["Out[`1`] = `2`", $Line, Out[$Line] ]; Print[" "]; Print[" "]; Out[$Line] ) BatchRead2[filename_String] := Module[{firstline, result}, firstline = $Line; Unprotect[In, Out, InString]; Scan[(result = loop[#])&, ReadList[filename, HoldForm[Expression]] ]; Out[firstline] = result; Protect[In, Out, InString]; result ]