Xer-Reader
Read the contents of a Primavera P6 XER file using Python.
Xer-Reader makes it easy to read, parse, and convert the data in a XER file to other formats.
_Refer to the Oracle Documentation for more information regarding how data is mapped to the XER format.
Tested on XER files exported as versions 15.2 through 19.12._
Install
Windows:
pip install xer-reader
Linux/Mac:
pip3 install xer-reader
Usage
Import the XerReader class from xer_reader.
from xer_reader import XerReader
Create a new instance of an XerReader object by passing in the XER file as an argument. XerReader can accept the file path represented as a str or pathlib Path object, or a Binary file received as a response from requests, Flask, FastAPI, etc...
file = r"/path/to/file.xer"
reader = XerReader(file)
Attributes
data[str] - The contents of the XER file as a string.export_date[datetime] - The date the XER file was exported.export_user[str] - The P6 user who export the XER file.export_version[str] - The P6 verison used to export the XER file.file_name[str] - The name of the file without the '.xer' extension.
Methods
check_errors() -> list[str]
Checks the XER file for missing tables and orphan data, and returns the results as a list of errors.
- Missing tables can occur when an entry in Table 1 points to an entry in Table 2 but Table 2 does not exist at all.
- Orphan data occurs when an entry in Table 1 points to an entry Table 2 but the entry in Table 2 does not exist.
*`delete_tables(table_names: str)** -> _str_ Delete a variable number of tables (_table_names_) from the XER file data and returns a new string (_Does not modifyXerReader.data` attribute_).
In the following example the tables associated with User Defined Fields are removed from the XER file contents and stored in a new variable new_xer_data, which can then be written to a new XER file:
new_xer_data = reader.delete_tables("UDFTYPE", "UDFVALUE")
with open("New_XER.xer", "w", encoding=XerReader.CODEC) as new_xer_file:
new_xer_file.write(new_xer_data)
get_table_names() -> list[str]
Returns a list of table names included in the XER file.
get_table_str(table_name: str) -> str
Returns the tab seperated text for a specific table in the XER file.
has_table(table_name: str) -> bool
Return True if table (table_name) if found in the XER file.
to_dict() -> dict[str, Table]
Returns a dictionary with the table name as the key and a Table object as the value.
to_csv(file_directory: str | Path, table_names: list[str], delimeter: str) -> None
Generate a CSV file for each table in the XER file. CSV files will be created in the current working directory.
Optional file_directory: Pass a string or Path object to specify a folder to store the CSV files in.
Optional table_names: List of tables names to save to CSV files.
Optional delimeter: Change the default delimeter from a tab to another string (e.g. a coma ",").
reader.to_csv(table_names=["TASK", "PROJWBS"], delimeter=",")
to_excel() -> None
Generate an Excel (.xlsx) file with each table in the XER file on its own spreadsheet. The Excel file will be create in the
current working directory.
*`to_json(tables: str)`** -> str
Generate a json compliant string representation of the tables in the XER file.
Optional: Pass in specific table names to include in the json string.